读书笔记 effective-objc

读书笔记 effective-objc

2019, Mar 18    

前言

抽空写下笔记把, 按照三次阅读记录写,

  1. 这本书能告诉我什么?
  2. 我该如何做?
  3. 为何这么做

这本书能告诉我什么

  1. 熟悉 objc
  2. 对象,消息和运行时
  3. 接口和 API设计
  4. 协议和分类
  5. 内存管理
  6. 块和大中枢派发
  7. 系统框架

我该如何去做

熟悉 objc

  1. 了解 objc 语言的起源
  2. 在类的头文件中尽量少引入其他头文件
  3. 多用字面量, 少用与之等价得方法
  4. 多用类型常量, 少用#define预处理指令
  5. 用枚举表示状态, 选项, 状态码

对象, 消息, 运行时

  1. 理解属性这一概念
  2. 在对象内部尽量访问实例变量
  3. 理解”对象等同性”这一概念
  4. 以”类族模式”隐藏实现的细节
  5. 在既有类中使用关联对象存放自定义数据
  6. 理解 objc_msgSend 得作用
  7. 理解消息转发机制
  8. 用”方法调试器”调试黑盒方法
  9. 理解”类对象”的用意

接口和 api 的设计

  1. 用前缀 避免命名空间的冲突
  2. 提供全能初始化方法
  3. 实现 description 方法
  4. 尽量使用不可变的对象
  5. 使用清晰而协调的命名方式
  6. 为私有方法加前缀
  7. 理解 objc 的错误模型
  8. 理解 NSCopying协议

协议和分类

  1. 通过委托和数据源协议进行对象间的通信
  2. 将类的实现代码分散到便于管理的数个分类里
  3. 总是为第三方分类增加前缀
  4. 请勿在分类中增加属性
  5. 使用 “class-continuation分类”隐藏分类实现细节
  6. 通过协议提供匿名对象

内存管理

  1. 理解引用计数
  2. 以 ARC 简化引用计数
  3. 在 dealloc 方法中 只释放引用, 并解除监听
  4. 编写异常安全代码时, 注意内存管理
  5. 以弱引用避免保留环
  6. 以”自动释放池块” 避免内存峰值
  7. 以”僵尸对象”调试内存管理问题
  8. 不要使用 retainCount

块和大中枢派发

  1. 理解 block 这一概念
  2. 为常用的 block 类型创建 typedef
  3. 用 hander 块, 降低代码的分散程度
  4. 用块引用其所属对象时, 避免保留环
  5. 多用派发队列, 少用同步锁
  6. 多用 GCD 少用, performSelect
  7. 掌握 GCD 及操作队列的操作时机
  8. 通过 dispatch group 机制, 根据系统资源状况来执行任务.
  9. 使用 dispatch_once来执行只需要运行一次的进程安全代码
  10. 不要使用 dispatch_get_current_queue

系统框架

  1. 熟悉系统框架
  2. 多用块枚举, 少用 for 循环
  3. 对自定义其内存管理的 collection使用无缝桥结
  4. 缓存使用 NSCache 而不要使用 NSDictionary
  5. 精简 +load 和 -initlization 的代码
  6. 别忘了 NSTimer 会保留其操作对象

为何要这么做?

TODO: 下次阅读的时候需要回答自己两个问题, 具体要如何做?
具体这么做的原因是什么?
后续将结果更新到这篇博文.