程序猿随笔-生活工作点滴面试题

iOS 基础知识总结

2019-07-25  本文已影响79人  Devbrave
1. 什么情况下用weak关键字,相比assign有什么区别?
2. @property的本质是什么?ivar、getter、setter是如何生成并添加到这个类中的
3. @protocol和category中如何使用@property
  1. protocol中使用property只会生成setter和getter方法的声明,我们使用属性的目的,是希望遵循我协议的对象能实现该属性。
  2. category中使用property只会生成setter和getter方法的声明,如果需要给category增加属性的实现,需要借助runtime运行时的两个函数:objc_setAssociatedObjectobjc_getAssociatedObject
4. @synthesize和@dynamic的作用
  1. 如果property对应的@synthesize和 @dynamic都没写,那么默认的就是@synthesize var = _var
  2. @synthesize 的语义是如果你没有手动实现setter和getter方法,那么编译器会自动为你加上这两个方法。
  3. @dynamic告诉编译器属性的setter和getter方法由用户自己实现,不自动生成。(对于readonly的属性只需提供getter方法)。假如一个声明为@dynamic var,然后你没有提供setter方法和getter方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺乏setter方法会导致程序崩溃,或者当运行到 someVar = instance.var时,由于缺乏方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的“动态绑定”。
5. __weak、__block理解
  1. __weak
    __weak只能在ARC模式下使用,只能修饰对象类型,不能修饰基本数据类型(如int等),__weak修饰的对象在block中不可以被重新赋值。使用__weak修饰,可以避免循环引用。
__weak __typeof(self) weakSelf = self; 
self.block = ^{
       [weakSelf doSomeThing];
});

2.__block
__block不管是ARC还是MRC模式下都可以使用,可以修饰对象类型,也可以修饰基本数据类型。在MRC下使用__block是可以避免循环引用的。在ARC下使用__block typeof(self) weakSelf = self时,block是用作添加引用来访问实例变量的,所以self会被retain一次,block也是一个强引用,所以会一起循环引用。__block修饰对象会增加引用。

持续更新

上一篇下一篇

猜你喜欢

热点阅读