读书笔记 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: 下次阅读的时候需要回答自己两个问题, 具体要如何做?
具体这么做的原因是什么?
后续将结果更新到这篇博文.