摘自消息传递的方式
1.说一下NSNotification 的实现机制?发消息是同步还是异步
哈希表+观察者模式
通知涉及到线程的知识,还有合成通知,交替是同步的等等
同步
2.KVO在使用过程中有什么注意点
1.在继承关系中,如果父类也绑定了一些KVO,子类在自己的路径中没有找到对应的路径是应该去父类找的,所以要显示调用super。
2.父类和子类有可能对同一个一个属性进行观察,我们知道如果对同一个属性的观察者可拆卸的两次会造成崩溃,所以我们每个类应该有唯一的Context进行区分。
3.简述KVO的注册依赖键是什么
+ (NSSet *)keyPathsForValuesAffectingPersonInfo
{
return [NSSet setWithObjects:@"name", @"age", nil];
}
4.如何做到KVO手动通知?
显式的调用didChangeValueForKey:
如果想实现手动通知,我们需要采用一个额外的方法
+(BOOL)自动通知ObserversForKey :( NSString *)key
这个方法重新返回YES,使用标记Key指定的属性是否支持KVO,如果返回变量NO,则需要我们手动更新。
5.__block的解释以及ARC和MRC下有什么不同?
__block在MRC下可以解决循环引用的问题,block内部的变量有了__block修饰,引用计数不会加1。
在ARC下就需要使用__weak来实现了
6.Block自动截取变量
Block自动截取变量会截取所有权的修饰符,但是对全局变量以及静态全局变量是不会截取的。
对于基本数据类型可以理解为值得传递。
对于指针类型,可以理解为地址的传递
7.Block 和 函数指针 的区别?
- 函数指针仅仅是一个地址 不具备函数原型信息 没有类型限制 比如一个指向变量的指针同样可以指向一个函数
但是 block作为函数地址 是有部分函数信息的 类型限制更明确
- block方式便于实现真正的函数式编程 让函数成为基本的运算元 真正的函数式语言可以去掉寄存器 提高程序
的执行效率
- 提高程序的健壮性 定义函数的代码会位于函数的代码段 如果函数内部出现内存溢出 会直接导致crash 因为代
码段是不可写的 block作为函数对象在运行时生成 位于站内 即使出现内存溢出 一般也不会直接导致crash
dispatch_block_t是被提交到调度队列的代码块的原型,大家可以在代码块没有参数和返回值时使用这种高效方法去实现
网友评论