iOS面试准备 - ios篇
ios面试准备 - objective-c篇
ios面试准备 - 网络篇
IOS面试准备 - C++篇
iOS面试准备 - 其他篇
Swift与oc区别
Swift和Objective-C共用一套运行时环境,Swift的类型可以桥接到Objective-C(下面我简称OC),反之亦然。
Swift优点
Swift容易阅读,语法和文件结构简易化。
Swift更易于维护,文件分离后结构更清晰。
Swift更加安全,它是类型安全的语言。
Swift代码更少,简洁的语法,可以省去大量冗余代码
Swift速度更快,运算性能更高。
Swift缺点
使用的人没有oc多(现在不明显了)
因为语言转换的成本 很多公司继续沿用oc
KVC
KVC是由NSKeyValueCoding非正式协议启用的一种机制,对象采用该协议提供对其属性的间接访问。
ios13禁止kvc访问私有属性。
kvc设值
设值就是调用函数:setValue:forKey,内部流程如下:
首先会调用对应setter方法,setkey、_setKey、setIsKey,如果没有,
检查accessInstanceVariablesDirectly方法是否返回YES,如果NO直接去setValue:forUndefinedKey:方法。如果为YES,
依次搜索成员变量 _key,_isKey,key,isKey 。如果找到就给他赋值,否则调用setValue:forUndefinedKey:
setValue:forUndefinedKey: 默认抛出异常
如果不想crash可以弄个NSObject的分类,重写setValue:forUndefinedKey: 做个空实现。
kvc取值
取值就是调用 valueForKey: ,内部流程如下:
●首先getter方法,getKey、key、isKey、_key 找到的话会直接调用。如果是BOOL或者Int等值类型,会将其包装成一个NSNumber对象。
● 检查类方法+ (BOOL)accessInstanceVariablesDirectly,如果返回YES(默认行为),那么和先前的设值一样,会按_key,_isKey,key,isKey的顺序搜索成员变量名的顺序搜索成员变量名。
● 如果还没找到,直接调用该对象的valueForUndefinedKey:方法,该方法默认是抛出异常。
KVO
iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
答. 当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,改为指向一个全新的通过Runtime动态创建的子类,子类拥有自己的set方法实现,set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、didChangeValueForKey方法,而didChangeValueForKey方法内部又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法。
如何手动触发KVO?
答. 被监听的属性的值被修改时,就会自动触发KVO。如果想要手动触发KVO,则需要我们自己调用willChangeValueForKey和didChangeValueForKey方法即可在不改变属性值的情况下手动触发KVO,并且这两个方法缺一不可,触发代码还是在他们两者之间。
其他
iOS:弄懂OC中的类与元类:
https://www.jianshu.com/p/51b4019a8df2
il、Nil、NULL、NSNull的区别
nil:指向一个对象的空指针,对objective c id 对象赋空值.
Nil:指向一个类的空指针,表示对类进行赋空值.
NULL:指向其他类型(如:基本类型、C类型)的空指针, 用于对非对象指针赋空值.
NSNull:在集合对象中,表示空值的对象.
try中return
在try里面return,finally会在return之后执行,所以这种情况下finally里面处理返回值会出问题,所以不要把return放try里面。
自增问题
下面两种方式,count的值都不会变。原理:count这个值0暂存起来,然后count自加1变成1,最后将暂存的值赋值给count,count最终的值为0
int count = 0;
count = (count++);
count = count++;
下面那样值会加一
count = ++count;