Effective Objective-C 总结

书是挺好的,但是翻译有的时候翻译真的有点烂,这里写一下我学习过程中,对例子解析一下。

6 了解属性的概念

这里引出OC和C++是不一样的,C++是使用offset的形式找到对应的数据变量,但是这样可能因为在不同的DLL导致起定义出错而crash,OC中将实例变量交给类对象管理,然后在运行期查找,不直接在编译期确定,可以避免上述的crash。甚至可以在运行期加入成员。

7 在对象内部尽量直接访问实例变量

我写代码的时候,经常有以下问题,一段代码中可以使用self.xxx或者_xxx进行访问,其中使用self.xxx可以使用懒加载,但是这里好像更推荐使用直接访问实例变量,也就是_xx这样,原因如下:

  1. 不会触发信息派发,那么就不会走msg_Send那一套,那么速度就会快一些
  2. 如果直接访问实例变量,那么就不会触发KVO(也就是键值观察)?

但是有时候可能使用懒加载,那么这时候可能就需要self.xxxx了,所以就有一个折中,如果是在写入的话,那么就通过设置方法self.xxx来做,如果是读取,那么就直接访问。

12 理解动态转发

这篇讲得不错,其中的代码样例

  1. 先看自己能不能解决,往自己对象里面加入方法,然后再跑一遍消息转发
  2. 自己不能解决,就让别的对象解决,看其他对象能不能能处理,比如说这个self的一些子类可能会处理这个self的方法
  3. forwardingInvocation直接兜底,要么吃掉,要么转发其他对象,要么换成其他消息,如果怎么都不行最后直接doesNotRecognizeSelector报错。
Objective-C 消息转发

17 实现description方法

顾名思义,主要是用于调试用的,在NSLog等控制台中进行调试,

  1. 带上对象的地址
  2. 带上对象的属性
发表在 未分类 | 留下评论

iOS开发总结

哎,iOS开发中的书籍分散的太多了,所以这里总结一下。

书籍

网络资源

发表在 知识总结 | 标签为 , | 留下评论

我的实习之旅

这篇文章应该是2024年4月5日发布的,但是因为数据回滚,所以成了现在发布(

不知不觉,自2024年5月13日到现在,马上就实习一年了,写一篇随笔记录一下

我记得很清楚,大三下找工作的时候,我有且仅有一家公司,也就是腾讯云智oc了,其他的全部挂了,(再次特别感谢马哥”收留”了我),所以在2024年5月12日下午打完CCPC邀请赛之后,我就第一次做高铁屁颠屁颠来到了武汉,5月13日周一开始我的实习之旅

腾讯云智实习

这是我第一次实习,一开始还弄了个笑话:在clone代码的时候,下意思先fork了一下仓库,然后再拉取,其实自己本来就是developer的权限了,直接clone下来就好了。🤣,笑死。

那是我最快乐的实习时光了,因为当时除了了我,还有两名实习生,我们三当时坐在一起,因为ld,mt都是在腾讯本部,也就是在深圳,没有人管我,所以当时我们很轻松,也认识了一些好哥们,对比现在,那都是玩的,总之,相对来说,确实很开心

但是本部的ld还有一位也来武汉这边了,教我了挺多道理,也教了我挺多技术,当时ld亲自在我身后,手把手教我使用WinDbg,我都有点害羞了,在大学的时候,都是我教别人,别人很少教我的,记得当时是简单使学习了WinDbg,如何在一个module上打断点,当模块加载之后断住,然后分析代码,虽然我之后没有从事Windows开发方向,但是借此机会,也学习了很多Windows上的东西。秋招面腾讯IEG的时候,面的非常顺章,面了很多Windows相关的问题,都回答出来了,不过因为没有hc,导致二面虽然过了,三面没约就直接挂了,当时面试的时候那个面试官感觉是非常想要我的,哎,呜呜,

网易,滴滴的实习

在结束了腾讯云智的实习之后,我开始了秋招面试,面了很多,但是挂的也很多,其中我先收到了网易互娱的实习转正和滴滴的offer,在网易的时候,感觉自己太差,转正不了,于是就干了一个多月辞职了,然后在家呆了一段时间,去了滴滴实习,结果去了不到一周,我在TME,也就是腾讯音乐的排序offer oc了,所以又辞职了,去了TME。所以说我在网易和滴滴的时间其实是非短暂的,但是遇到了很多不错的人,也收获到了很多。

我在网易的时候的mt跟我同姓,我自认为感觉他是一个话痨(这里没有任何贬义),我感觉我俩说话的时间都比我写代码的时间多(前人的经验也告诉我很多道理。)印象深刻的几句话是:

大学是你们最轻松的一段时间了,等上了班时间就很少了,大四,要么你在学校里面学技术,多学一些技术,要么你可以去外边旅游旅游,别待在宿舍或者家里面,没有学习的氛围。
谈个女朋友,大学里面谈女朋友比较纯粹
火哥(指上面的mt)说的确实不错,上了班感觉时间确实少了很多,要么学技术,要么旅游,别那么焦虑。至于第二点,大学里面认识的npy一双手都数得过来,没有感受到。

腾讯音乐实习

前面的哥们都放弃offer了,然后就轮到我了,因为毕业论文的原因,我只实习了一个月,导师是我的一面面试官,二面是我的ld + 1,(二面的时候感觉自己纯是备胎,虽然是过了,但是也是为了排序,怕前面的人不接offer)。于是我就来到了深圳。

哎,来到深圳,上来就给我一个社会教训,租了个甲醛房,后续去了维权,去了相关服务中心,然后要回了1k1,但是也损失了3k多,哎,随后租了个自如,小了点,只有7平,但是没有甲醛的味道,价格也还行,1k6,于是就住了下来。

来到这里,压力瞬间增加了很多,因为我是iOS的零基础,所以我要画很长时间去学习,几乎每天都是9点多才走,这不,刚好和前面的照应上了,属于自己的时间少了很多。,但是也学了很多,原来在云智的时候,135晨会我都觉得多,因为不知道汇报什么,这边天天晨会,所以压力很大,但是后面还是适应了(是不是搞iOS的适应力都很强?),哎,如今为了毕业论文,离职了,倒是也放松了一下,正式入职的时候,可能就要调整调整了。

实习的时候认识了很多人,我每次离职的时候,都会不自觉流泪,因为他们都是跟一样,都是搞程序的,算是志同道合的人了,相比于亲戚来说,聊得点更多,共同点更多,可能以后真的没有时间去见面了,所以说有些😭,哎,人生亦是如此,都是在不断地相见与离别。

总结一下,在实习的时候,我很焦虑,不知道以后的道路,但是我的各个导师,我认识的人都对我说,别管外界,做好自己就好,不要焦虑,因为你只能改变你自己,不能改变外界。做好自己就好了。希望我以后得程序员生涯,人生道路亦是如此,

发表在 实习, 随笔 | 标签为 , , | 留下评论

iOS UI绘图的总结

这周开始写代码了,主要是UI界面相关的,写的途中感觉对UI绘图相关的掌握的不是很好,所以来总结一下

frame和bounds

这两个参数是非常重要的,因为UI界面的位置坐标都跟这个有关的,主要是有以下区别

  • frame:表示的坐标都是相对于父节点的坐标
  • bounds:其中的坐标是关于自身的坐标

frame和bounds中都有origin.x和origin.y,而且还有size.width和size.height,根据上方可以看到,其实size.width和size.height在frame和bounds下的数据都是一样的(因为自身的长度和宽度不管在哪一个坐标系下其实都是一样的),但是origin.x和origin.y是不一样的,bounds下的origin都是0,因为其坐标系是按照自身。很显然,是frame下的情况下就是对于其父节点数值。

代码中常见的初始化方式:

- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;

那么如果有两个元素,B和C都在A坐标系下,如何将C放在A的右边呢,就可以写上这样的代码

UIImageView *b = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
UIImageView *c = [[UIImageView alloc] initWithFrame:CGRectMake(b.frame.origin.x + 10, b.frame.origin.y, 10, 10)];
[a addSubview:b]; // b 和 c 都在同一坐标系下
[a addSubview:c];

可以看到,b和c都在同一个坐标系下,所以c的初始化是按照b的frame.origin.x进行设置

图层

未完待续

发表在 Objective-C, UI | 标签为 , | 留下评论

Objective-C Runtime

之前学了一下Objective-C的Runtime,发现学的不是那么深刻,所以这里写一篇文章,算是边写边学了

概念

OC中加入了很多新的概念,其中主要好似有instace object和class object和meta object,主要是有以下区别

  • instance对象(实例对象):instance实例对象就是通过alloc出来的对象,每次调用alloc都会产生新的instance对象
  • class对象(类对象):每个类的内存中有且只有一个类对象
  • meta-class对象(元类对象):每个类的内存中有且只有一个元类对象

这里说是对象,其实是因为oc everything is object,所以这里抽象成对象了,如果是C++,那么其实就是类,零成本抽象,其实没有那么多区别

在存储的过程中,主要是有以下区别

  • 实例对象(instace object)
    • isa指针
      • 这里主要指向的是类对象
    • 其他成员变量
  • 类对象(class object)
    • isa指针
      • 指向的是元类对象
    • superClass指针
      • 指向的是他的父亲,是类对象的父亲,如果到顶了,那么指向的就是nil
    • 类的属性信息(@property),类的对象方法信息(method),类的协议信息(protocol),类的成员变量信息(ivar)
      • 存储的是当前的实例方法(也就是 – 开头的方法
  • 元类(meta object)
    • isa指针
    • superClass指针
      • 指向的是他的父类,也就是元类对象的父亲,这里有一点不同的是,如果到顶了,那么指向的是基类的class
    • 类的属性信息(@property),类的对象方法信息(method),类的协议信息(protocol),类的成员变量信息(ivar)
      • 存储的是static的变量和类方法(也就是+开头的方法)。

下面是相关图片的关系

消息发送

oc中的调用方法是在Runtime运行期展开的,而不是像C/C++一样在编译期就确定了,所以之类有点不同,大致的消息转发流程是(不管是instace对象调用还是类方法的调用):

  1. 先通过isa指针找到对应的类对象,或者是找到对应的meta-class
    1. 如果是实例方法(instace object)调用,那么先找到对应的类对象(class object),如果是类方法调用,先找到对应的元对象(meta-class object)
  2. 如果当前找到了,那么就直接执行对应的方法就行了
  3. 如果没有找到,那么就通过类对象或者实例对象的superClass指针往上找,就是沿着他的父类找,一直找,直到找到为止
  4. 如果最终找不到,那么就会crash(当然,也有其他补救措施)
    1. 这里有一点不同的是,注意到meta-class的superClass指针指向的是基类的类对象,那么这时候还会往基类的类对象中找一下,调用一下,如果找不到,就crash。
发表在 Objective-C, 计算机 | 标签为 , | 留下评论

找实习时要注意什么?

  • 现在学弟们都开始找实习了,遂根据我的找实习的经历,写一篇关于找实习的文章
  • 当然,以下更多是关于计算机专业的。其他专业也可以参考参考
  • 以下内容纯属个人见解,仅仅是希望给大家提供一份帮助,如果有不同意见,欢迎一起讨论。
  • 未完待续,有机会待补充。

投递相关

一定要海投,对于大部分来说(尤其像我一样,四非学历),不是想去哪一个公司就去哪一个公司的,面试的时候有很大的除技术之外的运气成分,所以一定要海投,要所有的公司都要投递一遍,可以打开Boss直聘这样的软件,然后猛猛投递,有面试的话,就开始面试,面过了再选。

在水群的过程中,我发现学弟投递简历的时候更想要投递小厂,对大厂比较畏惧,可能是因为技术难度等方面有点高,所以说畏惧投递大厂。但是,大厂之所以是大厂,不光是因为薪资待遇比小厂的要好,更重要的是大,他招的人多啊,招收的人多代表有更多的机会,而且很多厂是可以面挂重新捞人的,所以说,这个不要担心。

面试流程

一般互联网公司是(2 或者 3 + 1面,也就是2到3次技术面 + 1次hr面

  • 网上投递:
    • 主要是官网和内推
      • 官网:直接在各大厂的官网上投递,如果不知道什么公司可投,可以看牛客上别人投递的公司
      • 内推:找别人的内推码,填上去,虽然可能用处不大,但是肯呢个还是有一点作用。(最主要的是你进公司了,内推你的人有米赚(bushi.
  • 技术面:
    • 对于一面来说,大概率是你面试的组的一个员工来面试,相对来说,面试的时候,比较简单,侧重于面试的计算机八股 + 基础知识,只要准备好,过的概率还是非常高的
    • 二面大概率是你的ld了,也就是这个组的组长,面试的时候侧重于你的项目水平,要求更高,对于项目方面一定要准备好,我在二面翻车的几率非常高,几乎都是二面挂的。
    • 如果有三面,那么可能是你的+2,在我的面试情况中,跟二面的相关内容是差不多的,好好准备就行了。
    • 当然,以上是大概率,也有可能不是,比如对我来说,有一次面试一面二面是同一个人,还有一次一面是我的导师,二面就是我的+2了(ld的ld)。
  • hr面: 基本就是问你的个人情况,基本问题不大,如果你在hr面挂了,可能就是因为被排序,有人面的比你更好所以挂了。

必要技能

技术

众所周知,面试的时候,虽然有一部分运气因素之外,但是最重要的还是自己的技术水平,以我为例,实习和校招的面试的时候,因为我的岗位不同,所以考察了一下内容

  • 计算机网络/操作系统
    • 这些就比较多,具体可以看各大博主整理的相关资料。
  • 各个语言的基础知识,:
    • 如C++中的虚函数表,sizeof一个类是多大,inline是干什么的。这些基础问题
    • 如果是其他的Java语言,也有对应的面试题
  • 项目:
    • 你的项目的效果是什么,为什么选择这个项目,有什么量化指标,你在做这个项目中遇到了什么问题,这个问题你是怎么解决的。
  • 根据你选择的岗位不同,可能考察的也会有所不同
    • 比如我在面试的时候,考察过Windows相关的知识点,比如说COM编程MFC,DLL相关,Dump文件WinDbg调试相关,也考察过汇编,读相关汇编,然后看这段代码的意思等问题。如果是其他岗位,可能就没有这些问题。

算法题

  • 其实大部分厂的算法题不是那么难,认真准备还是能写出来的,其主要出的都是链表题,主要是leetcode上面的hot100题目,在面试前最起码都过一遍,最好是能功利一点,能’背’下来,这个背是加引号的背,因为面试的时候紧张 + 时间短,不像打acm一样,有五个小时的时间,这个时间很短的,所以要看到题目,就能直接写出来是最好的。
  • 另外,笔者自己是打acm的,一般是用C++写题,这时候很多ap(acm批,简称ap)就喜欢#define <bits/stdc++.h> 然后直接 using namespace std; 我认为这个在面试的时候,是非常不好的,因为面试官没有打过算法竞赛,而且会看你除了算法题写的对不对,还有你在写算法题的时候的工程化,规范化。按照写工程的思路去写算法题。
    • 不要使用万能头文件和using namespace std;
    • 写代码的时候要有缩进,要规划化。
    • 代码命名要更加的准确,起一个int类型的名称的时候int size 都比 int a 这样的命名好。

题外话:我第一段实习结束的时候,我问了我的导师(也就是我一面面试官),为什么当时把我招进来,他说:看你在大学的时候打了这么多比赛,拿了挺多奖,面试的时候代码写的也挺好的,所以就要你了,泪目,这是我大三下找实习中为数不多的面试中唯一过的面试,然后就去实习了。

沟通能力

面试本质上就是沟通。是你选择这家公司,然后公司选择了你,是一个双向选择的过程。如果你的技术很好,那么在面试的时候无法表达,无法将你想要表达的信息传递给面试官,面试官觉得驴唇不对马嘴,也是不行的,这是我面试的时候,某一个面试官在我知乎上留的相关言论,也作证了这个观点,同样,在工作的时候,沟通能力也是非常有必要的,如何正确表达,是非常重要的。对此我觉得有以下建议:

  1. 面对一道问题的时候,自己将要表达的内容说出来,然后看相关内容是否流畅,是否清晰,能否正确表达出来。因为有心里面想的,说出口可能就出错了,这个要在面试前好好准备
  2. 专业术语一定要表达清楚,以我为例,有一次私钥和公钥这些专业术语就没记住,其实自己是知道的,但是面试的时候可能会突然紧张,突然就忘记了,所以这个也要好好准备。
  3. 一定要流畅表达,可能面试官是不懂你这个的,但是可以通过的你的表达,看你是否是真的掌握这个,(自己掌握的和心虚的还是有差别的,(其实就是唬住面试官。

题外话:我自己的沟通水平简直是一tuo,很多东西也无法表达清楚,可能这篇文章也是如此qwq,实习结束的时候,ld也对我语重心长的说在以后得职业生涯中,提高提高自己的沟通能力,真的泪目┭┮﹏┭┮。

面试成功的因素不光有以上原因,可能还有对应的运气成分,面试失败不要紧,从面试中吸取教训,多复盘,多面试,好好准备下一次面试。

其他话术

面试的时候有很多话术,比如说你能否马上到岗实习,能实习多长时间,对于这个,要尽量答应对方的要求,比如说实习六个月,你就说实习六个月以上,即使你不能实习六个月以上,你也要说,你要确保你先过这个面试,然后再选,虽然有点不仁道,但是确实这样的。一定要确保你面试过了,将主动权掌握在自己的手上,然后再选。

广告

腾讯音乐实习现在已经开始了,与TX的面试是不冲突的,投递链接:tme招聘 内推码:K0EYQQ,多一次面试,多一次找到实习的机会。(为什么上面说内推没用还要弄一个内推码,因为内推进去我好像是有米的赚的(maybe

发表在 计算机 | 标签为 , | 留下评论