这本书很是的好,看完后,感触挺深,总结纪录一下,针对ios开发的备忘:
注:分类和原著有些不一样,本身总结学习用的,仅供参考。
- 了解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下已经废弃。
读后感:本书讲的东西,有一些地方难免重复。不少东西其实都在平时阅读的源码中体现了。以致于让我错觉得:“原本就是这样的”。
感谢做者写出这样的书来分享本身的经验,很是感谢。