Effective objective-c 2.0阅读笔记

这本书非常的好,看完后,感触挺深,总结纪录一下,针对ios开发的备忘:
注:分类和原著有些不同,自己总结学习用的,仅供参考。
 
  • 系统篇:
  1. 了解oc起源:继承c,由Smalltalk演化而来。动态语言,运行期决。需要熟悉c语言。
     6.  理解变量属性 a.原子性 b.读写 c.内存管理语义 d.方法名 。尽量少用atomic .注意使用copy属性避免数据安全问题。 还有oc动态语言特性,硬编码问题。类内部不要直接访问变量。
     7.  还是重复了上一篇:在对象内部尽量直接访问实例变量。a.快,没有派发。b.避免copy复制属性。c.不会触发kvo。d.排错问题有点扯了。
     8.  对象等同问题。 isEqual机制原理。hash方法判断对象是否等同的逻辑。
     10.runtime机制的associatedObject.(关联对象),一般不用。
     11.理解objec_msgSend机制(消息传递机制)。还是动态语言特性。a.oc对象每个方法都可以视为简单的c函数。使用了尾递归优化了栈,避免过早栈溢出。
     12.理解消息转发机制,经常有:unrecognized selector sent to instance xxx的log。关键词:动态方法解析,系统框架自带的缓存方法机制原理。
     13.方法调配,黑盒子调试。看到这一篇的时候,我只是觉得作者有点丧心病狂,走火入魔了。
     14.理解“类对象”用意。a.对象isa指针的定义。b.判断对象类型方法,不用isEqual,可能有消息转发触发。
     21.理解错误类型。a.正确使用NSError。
     22.理解NSCopying协议。a.自定义对象实现copy功能。b.浅拷贝和深拷贝。
     23.通过委托和数据源协议进行对象间通信。a.使用观察者模式,要考虑weak属性(非持有)。b.可以实现含有位段的结构体存储信息。
     26.勿在分类中声明属性。category中不能添加变量的问题。可以用associate来解决。(runtime机制)尽量避免这种需求,代码会比较乱,作者说:经常有不可预知的bug。
     37.理解“块”这一概念。a.“堆栈块”的概念怀疑作者自己象形取的,就是注意块的引用范围问题,避免其被提前释放了。使用copy属性后,会复制到堆中。b.块也就是闭包语法。
     38.为常用的块类型创建typedef。
     47.熟悉系统框架(cocoa框架),Foundation框架,CFNetwork,CoreAudio,AVFoundation,CoreData,CoreText,TextKit,UIKit,QuartzCore(图形)等。同样是说了c的重要性。
    
  • 编码习惯篇:
     2.  在类的头文件尽量少引入其他头文件,原因:a.减少编译时间。b.避免相互引用的问题(import使用了一些预处理进行优化了)。使用@class来解耦(向前声明),实现class-continuation来实现细节隐藏(包括delegate, 或者独立申明一个文件,再引入,当然,还是可以轻易的被人down出来头文件的)
     3.  使用自带的糖语法(字面量语法)。这里只说一下注意点:
          
     4.  多用类型常量,’少用’#define. a.类型问题 不可以避免修改。还是要根据代码需求进行处理。例如: a.#define UNLog(xx, ...) NSLog(@“”) b.书中很多地方提到的命名问题
     15.用前缀避免命名空间冲突。还是命名问题,作者再次强调了。
     18.尽量使用不可变对象。a.尽量创建readonly对象,可以在class-cotinuation中修改成readwrite。b.主要问题是容易造成数据安全的问题。
     19.使用侵袭而协调的命名方式。还是命名问题。
     20.为私有方法名家前缀。还是命名问题,估摸着,作者应该是被命名不好的同学这么惨了。
     25.总是为第三方的分类名称加前缀。还是命名,这一点,做过sdk的同学应该感触很深。
     27.使用“class-continuation分类”隐藏实现细节。看到这标题,有种作者在凑字数的错觉。
 
  • 代码逻辑优化篇:
     5.  使用枚举,选项,状态代码. 注意一下枚举是会自增1的。(DRY)
     9.  使用抽象工厂模式,创建类族。
     16.提供“全能初始化方法”。a.文档说明 b.注意子类父类的继承覆写问题。
     17.实现description方法。这里让我想到了另一个问题:如何将自定义的object存到NSUserDefault。也是一样的解决思路的。
     24.将嘞的实现代码分散到便于管理的数个分类之中。
     28.通过协议提供匿名对象。使用匿名对象来隐藏类型名称l。
     39.用handler块降低代码分散程度条的应用。
     40.用块引用其所属对象时不要出现保留环。
     41.多用派发队列,少用同步锁。
     42.多用GCD,少用performSelector系列方法。
     43.掌握GCD及操作队列的使用时机。
     44.通过Dispatch Group机制,根据系统资源状况来执行任务。
     45.使用dispatch_once来执行只需要运行一次的线程安全代码。a.注意一下滥用单例的问题。
     46.不要使用dispatch_get_current_queue。a.应该做调试用。*慎用。
     48.多用枚举,少用for循环。
     49.对自定义其内存管理语义的collection使用无缝桥接。
     50.构建缓存时选用NSCache而非NSDictionary。a.自动释放资源。“线程安全”。可以控制内存。b.注意缓存,加快响应速度。
     51.精简initialize与load的实现代码。提高响应速度,避免“依赖环”的几率。
     52.别忘了NSTimer会保留其目标对象。ps:ALL
 
  • 内存管理篇:
    29.理解引用计数。理解基本的对象引用计数,资源释放回收,weak引用问题,循环应用,锁的问题。(又是混字数的)
     30.以ARC简化引用计数。a.__unsafe_unretained与weak的区别。b.__weak关键字。c.常见的释放资源问题。例如非oc对象的释放问题。
     31.在dealloc方法中只释放引用并解除监听。a.delloc方法中,注意一些KVO.NSNotification的解除问题。b.文件流的引用关闭问题。c.delloc代码段表明已经在回收了。
     32.编写“异常安全代码”时留意内存管理问题。try代码中会有泄漏问题。其实都发生了catch了,泄漏了已经不重要了。那个辅助功能也是鸡肋,没机会用的赶脚。
     33.以弱引用避免保留环。看到这个标题,感觉作者又来混字数的。读完感觉也是这样。DRY。
     34.以“自动释放池块”降低内存峰值。a.使用@autoreleasepool (貌似也没有用上的机会的赶脚)
     35.用“僵尸对象”调试内存管理问题。a.常见的僵尸模式调试以及全局异常断点。b.僵尸模式的实现原理。通过修改isa指针,避免释放等一系列操作,终止程序。
     36.不要使用retainCount。a.ARC下已经废弃。
 
读后感:本书讲的东西,有一些地方不免重复。很多东西其实都在平时阅读的源码中体现了。以至于让我错以为:“本来就是这样的”。
感谢作者写出这样的书来分享自己的经验,非常感谢。
原文地址:https://www.cnblogs.com/Lxiaolong/p/4433915.html