[个人博客搬运]Effective Objective-C 2.0读书笔记

Effective Objective-C 2.0读书笔记


第一章

  • 消息结构和函数调用的区别:消息调用的语言,其运行时所执行的代码由运行环境来决定;函数调用则有编译器决定。

第二章

  • 在类的头文件中尽量少引用其他头文件,用@class字段,减少编译时间

第三章

  • 多用@()来创建字面量

第四章

  • 用#define会把所有的做替换,并且不会做类型判断,也不会有同名警告。#define kTimeDuration 0.3

  • 如果只要该编译单元(.m文件)内使用。static const NSInteger kTimeDuration = 0.3;

  • 如果要给外部可用,那么就这样,命名要谨慎:

  • (.h)extern NSString * const EOCStringConstant;

  • (.m) NSString * const EOCStringConstant = @"Value";


第五章

  • 用NS_ENUM和NS_OPTIONS定义的枚举类型,并指明期底层数据类型,就能保证是用开发者选择的底层数据类型来实现,而不会采用编译器所选的类型。

  • 如果想组合多个选项的枚举,把值定义为2的幂,这样就可以“按位或”起来。


第六章

  • @property的各种语义声明。在使用copy的时候,会拷贝一份副本,如果自己实现setter方法,自己要加上copy

第七章

  • none

第八章

  • 两个对象相等,请重写isEqual:方法

第九章

  • 用类簇来屏蔽细节(大图浏览器)

第十章

  • 关联对象,具体可见UIAlertView绑定block的demo,但是建议不要轻易使用该技术可能导致难以发现的bug

第十一章

  • id returnValue = [someObject messageName:parameter];
  • 其中,someObject叫做“接收者”(receiver),messageName叫做“选择器”(selector), 选择器和参数合起来称为“消息(Message)”

  • 编译器会把它转换为如下函数:

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


第十二章

  • 消息转发流程(三部曲):
  1. 先询问接受者能否动态添加方法来处理未知的selector(unknown selector),这叫“动态方法解析”,会调用其所属类的这个方法,取决于是类方法还是实例方法。此方案常用来实现@dynamic.
  • (BOOL)resolveInstanceMethod:(SEL)selector;

  • (BOOL)resolveClassMethod:(SEL)selector;

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

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

  • 具体的@dynamic示例见p48

第十三章

  • Method Swizzling,可以给“完全不知道其具体实现的(completely opaque 完全不透明的)”黑盒方法添加日志记录功能。不要滥用该方法

第十四章

  • 每个对象结构体的首个成员是Class类的变量,该变量定义了对象所属的类,即“isa”指针。Class对象也被定义为P57的结构体,结构体存放类的元数据“metadata”,该结构体的首个变量也是个isa指针,说明Class本身也是一个Objective-C对象。类对象的isa指针指向的类型是另外一个类,叫做元类“metaclass”,“类方法”(+号方法)就是定义在metaclass里面的。

  • isMemberOfClass判断对象是否是一个特定具体类的实例。

  • isKindOfClass是判断对象是否为某类或其派生类(子类)的实例。


第十五章

none


第十六章

none


第十七章

  • 重写description方法,可以利用NSDictionary的desccription方法来简化

第十八章

none


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

none


第二十二章 copy

  • copy和mutableCopy调用小结,copy返回不可变,mutableCopy返回可变。
  • 针对不可变对象调用copy返回该对象本身(旧的),调用mutableCopy返回一个可变对象(新的);

  • 针对可变对象调用copy返回一个不可变对象(新的),调用mutableCopy返回另外一个可变对象(新的)。

  • @property
  • 不可变类型属性,推荐使用copy,因为假设该对象实际上指向的是一个mutable的对象,mutable对象的改变不会导致该对象的改变;假设指向的不是mutable的对象,那么copy和strong是等价,都是执行一次retain。

  • 可变类型属性,不能使用copy,因为copy产生的对象是一个不可变对象,跟属性描述是冲突的。

  • 深拷贝和浅拷贝的区别:
  • 深拷贝:拷贝内容,且产生新对象。新对象计数器置为1,原对象计数器不变。副本对象改变时不改变原对象

  • 浅拷贝:拷贝地址,不产生新对象。原对象计数器加1.只有一种情况是浅拷贝(不可变对象调用不可变的copy方法)


第二十三章

none


第二十四章

  • 给一个比较大的类拆分成几个功能区块的小类,可以考虑使用分类

第二十五章

  • 使用分类时,尽量要添加前缀

第二十六章

  • 分类不能添加属性,要使用关联对象,或者@dynamic。所以关于对象的所有定义都要放在主接口中

第二十七章

看不懂怎么办


第二十八章

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


第二十九章

  • ARC是把几乎所有的内存管理事宜都交给编译器来决定,开发者只需专注业务逻辑

  • Setter方法中,必须先retain新值,release旧值,然后更新实例对象。顺序很重要否则会变成悬挂指针

  • 调用release会立刻递减对象的引用计数,调用autorelease会在稍后递减引用计数,通常在下一次事件循环(event loop)时递减,不过也有可能执行得更早些(34章)

  • 内存泄露:没有正确释放该释放的内存(已经不再使用的内存)


第三十章

  • 使用ARC要注意,引用计数实际上还是要执行的,只不过保留和释放操作现在是由ARC自动为我们添加,并且ARC添加的是底层的C语言函数,如objc_retain。

  • ARC只负责管理Objective-C对象的内存,CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain、CFRelease.


第三十一章

  • ARC会通过自动生成的.cxx_destruct方法在dealloc中自动添加释放代码。CoreFoundation对象必须手工释放。

第三十二章

  • none

第三十三章

  • 用弱引用避免循环引用

第三十五章

不是很明白


第三十六章

  • 不要使用retainCount

第三十七章、第三十八章

  • 定义block的时候,他的内存区域是分配在栈上的。就是说,块只在定义它的范围内有效。比如:

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];

}

  • block会把局部变量捕获,block会在定义时就把当时的局部变量值捕获进来;如果想在运行时再捕获,就加上__block

第三十九、四十章

none


第四十一章

  • 多用派发队列表述同步语义,比@synchronized和NSLock要好
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容