[个人博客搬运]Effective Objective-C 2.

2017-03-23  本文已影响12人  zzqiltw

Effective Objective-C 2.0读书笔记


第一章


第二章


第三章


第四章


第五章


第六章


第七章


第八章


第九章


第十章


第十一章

id returnValue = objc_msgSend(someObject, @selector(messageName:), parameter);


第十二章

  1. 先询问接受者能否动态添加方法来处理未知的selector(unknown selector),这叫“动态方法解析”,会调用其所属类的这个方法,取决于是类方法还是实例方法。此方案常用来实现@dynamic.
  1. 如果执行完第一步没有结束,那么接受者自己就无法再以动态新增方法的手段来响应该消息了。此时Runtime会看看有没有其他的对象来处理这条消息,转发给其他的接受者来处理.下面的方法如果能找到备胎对象,就把备胎对象返回;如果没有找到就返回nil。"备援接收者".模拟多重继承。
  1. 如果没有备胎,那就把消息有关的全部细节都封装到NSInvocation对象中,再给接收者最后一次机会来处理。会启动“完整的消息转发机制”。首先创建NSInvocation对象,把尚未处理的那条消息有关的全部细节都封于其中,此对象包含选择器、目标(target)及参数。在触发NSInvocation对象时,“消息派发系统(message-dispatch system)”会亲自出马,把消息指派给目标对象:
  1. 如果最后调用了NSObject类的方法还是搞不定,会继续调用doesNotrecognizeSelector来抛出异常。

全过程图示如下:或者见p49


第十三章


第十四章


第十五章

none


第十六章

none


第十七章


第十八章

none


第十九章/第二十章/第二十一章

none


第二十二章 copy


第二十三章

none


第二十四章


第二十五章


第二十六章


第二十七章

看不懂怎么办


第二十八章

通过协议来隐藏类名,类似泛型的思想


第二十九章


第三十章


第三十一章


第三十二章


第三十三章


第三十五章

不是很明白


第三十六章


第三十七章、第三十八章

void (^block);

if (A) {

block = ^{ NSLog(@"A")};

} else {

block = ^{ NSLog(@"B")};

}

这个block很可能会被回收,因为只在if或者else里面有效。

正确的做法:

void (^block);

if (A) {

block = [^{ NSLog(@"A")} copy];

} else {

block = [^{ NSLog(@"B")} copy];

}


第三十九、四十章

none


第四十一章

上一篇下一篇

猜你喜欢

热点阅读