读书笔记 effective-objc
2019, Mar 18    
      前言
抽空写下笔记把, 按照三次阅读记录写,
- 这本书能告诉我什么?
 - 我该如何做?
 - 为何这么做
 
这本书能告诉我什么
- 熟悉 objc
 - 对象,消息和运行时
 - 接口和 API设计
 - 协议和分类
 - 内存管理
 - 块和大中枢派发
 - 系统框架
 
我该如何去做
熟悉 objc
- 了解 objc 语言的起源
 - 在类的头文件中尽量少引入其他头文件
 - 多用字面量, 少用与之等价得方法
 - 多用类型常量, 少用#define预处理指令
 - 用枚举表示状态, 选项, 状态码
 
对象, 消息, 运行时
- 理解属性这一概念
 - 在对象内部尽量访问实例变量
 - 理解”对象等同性”这一概念
 - 以”类族模式”隐藏实现的细节
 - 在既有类中使用关联对象存放自定义数据
 - 理解 objc_msgSend 得作用
 - 理解消息转发机制
 - 用”方法调试器”调试黑盒方法
 - 理解”类对象”的用意
 
接口和 api 的设计
- 用前缀 避免命名空间的冲突
 - 提供全能初始化方法
 - 实现 description 方法
 - 尽量使用不可变的对象
 - 使用清晰而协调的命名方式
 - 为私有方法加前缀
 - 理解 objc 的错误模型
 - 理解 NSCopying协议
 
协议和分类
- 通过委托和数据源协议进行对象间的通信
 - 将类的实现代码分散到便于管理的数个分类里
 - 总是为第三方分类增加前缀
 - 请勿在分类中增加属性
 - 使用 “class-continuation分类”隐藏分类实现细节
 - 通过协议提供匿名对象
 
内存管理
- 理解引用计数
 - 以 ARC 简化引用计数
 - 在 dealloc 方法中 只释放引用, 并解除监听
 - 编写异常安全代码时, 注意内存管理
 - 以弱引用避免保留环
 - 以”自动释放池块” 避免内存峰值
 - 以”僵尸对象”调试内存管理问题
 - 不要使用 retainCount
 
块和大中枢派发
- 理解 block 这一概念
 - 为常用的 block 类型创建 typedef
 - 用 hander 块, 降低代码的分散程度
 - 用块引用其所属对象时, 避免保留环
 - 多用派发队列, 少用同步锁
 - 多用 GCD 少用, performSelect
 - 掌握 GCD 及操作队列的操作时机
 - 通过 dispatch group 机制, 根据系统资源状况来执行任务.
 - 使用 dispatch_once来执行只需要运行一次的进程安全代码
 - 不要使用 dispatch_get_current_queue
 
系统框架
- 熟悉系统框架
 - 多用块枚举, 少用 for 循环
 - 对自定义其内存管理的 collection使用无缝桥结
 - 缓存使用 NSCache 而不要使用 NSDictionary
 - 精简 +load 和 -initlization 的代码
 - 别忘了 NSTimer 会保留其操作对象
 
为何要这么做?
TODO: 下次阅读的时候需要回答自己两个问题, 具体要如何做?
具体这么做的原因是什么?
后续将结果更新到这篇博文.