一、 OC基础
1. @property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的
- 简单解释:
- @property 的本质是什么? @property = ivar + getter + setter;
ivar、getter、setter是如何生成并添加到这个类中的? “自动合成”( autosynthesis);
- 详细解释
2. @protocol 和 category 中如何使用 @property
- 简单解释
- protocol :我们只需遵循协议,并实现属性就行
- category:只生成了
setter、getter方法没有生成ivar 变量,可以通过关联对象进行实现
- 详细解释
- 在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,我们使用属性的目的,是希望:“遵守协议的对象”能实现该属性,
- category 使用 @property 也是只会生成 setter 和 getter 方法的声明,如果我们真的需要给 category 增加属性的实现,需要借助于运行时的两个函数:
objc_setAssociatedObject设置关联属性objc_getAssociatedObject获取关联属性
3. @synthesize和@dynamic分别有什么作用?
- 简单解释:
@synthesize使编译时: 自动生成setter, getter方法以及 var 变量;@dynamic使编译时:不生成setter,getter方法以及var 变量;- 如果
@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = _var; - 这两个关键字只能在实现文件里使用
- 如果
- 详细解释
4. ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
- 简单解释
- 对应基本数据类型默认关键字是
atomic、readwrite、assign - 对于普通的 Objective-C 对象
atomic、readwrite、strong
- 对应基本数据类型默认关键字是
- 参考链接
5. runtime 如何实现 weak 属性?
-
简单解释
-
详细解释
6. weak属性需要在dealloc中置nil么?
- 简单解释
- 不需要
在ARC环境无论是强指针还是弱指针都无需在 dealloc 设置为 nil , ARC 会自动帮我们处理
- 详细解释 即便是编译器不帮我们做这些,weak也不需要在 dealloc 中置nil: 正如上文的:runtime 如何实现 weak 属性? 中提到的: 我们模拟下 weak 的 setter 方法,应该如下:
- (void)setObject:(NSObject *)object
{
objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_ASSIGN);
[object cyl_runAtDealloc:^{
_object = nil;
}];
}
如果对 cyl_runAtDealloc 的实现原理有兴趣,可以看下我写的一个小库,可以使用 CocoaPods 在项目中使用: CYLDeallocBlockExecutor
也即:
在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。
7. @property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?
- ** 简单解释**
属性可以拥有的特质分为四类:
- 原子性--- nonatomic 特质
- 读/写权限---readwrite(读写)、readonly (只读)
- 内存管理语义---assign、strong、 weak、unsafe_unretained、copy
- 方法名---getter= 、setter=
不常用的:nonnull,null_resettable,nullable
- 详细解释
8. 使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?
- 简单解释
- 在ARC下不需要。
在MRC中,对于使用retain或copy策略的需要 。在MRC下也不需要
无论在MRC下还是ARC下均不需要。
- 详细解释
9. 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
-
简单解释
- 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
- 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
-
详细解释
10. block有哪几种类型?怎么避免循环引用?
- 简单解释
-
根据在内存中的不同分为
- 数据区:
__NSGlobalBlock__ - 栈区:
__NSStackBlock__ - 堆区:
__NSMallocBlock__
- 数据区:
-
避免循环引用:
- __weak 修饰
- block 传值
-
- 详细解释
11. 什么时候会报unrecognized selector的异常?
-
简单解释
- 当没有找到这个方法的实现的时候就会报这个异常
- 因为OC是动态语言:在报这个异常之前,会进行消息转发,因而会有三次拯救程序崩溃的机会
-
详细解释
- runtime这篇文章里会有unrecognized selector重现的步骤
12. iOS 为什么给nil发送消息不会崩溃?
-
简单解释
- Objective-C中的函数调用都是通过objc_msgSend进行消息发送来实现的,而objc_msgSend会通过判断参数self来决定是否发送消息,如果传递给objc_msgSend的参数self为 nil,那么selector会被置空,该函数不会执行而是直接返回。
-
详细解释
二、Swift相关
持续更新中.....