消息传递的方式

摘自消息传递的方式

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是被提交到调度队列的代码块的原型,大家可以在代码块没有参数和返回值时使用这种高效方法去实现

你可能感兴趣的:(消息传递的方式)