type
status
date
slug
summary
tags
category
icon
password
GitBook for 《禅与 Objective-C 编程艺术》 笔记。
Golden Path
错误处理
通过参数返回 error 的引用,使用这样的方法时应当检查方法的返回值,而非 error 的引用。
一些苹果的 API 在成功的情况下会对 error 参数(如果它非 NULL)写入垃圾值(garbage values),所以如果检查 error 的值可能导致错误 (甚至崩溃)。
命名
常量加类名前缀
方法名少用 and
类
类名应该以三个大写字母作为前缀(双字母前缀为 Apple 的类预留),说明性的部分放在前缀和父类名的在中间(如:
ZOCTimelineViewController
)。初始化
推荐的代码组织方式是将 dealloc 方法放在实现文件的最前面(直接在 @synthesize 以及 @dynamic 之后),init 应该跟在 dealloc 方法后面。如果有多个初始化方法, 指定初始化方法 (designated initializer) 应该放在最前面,间接初始化方法 (secondary initializer) 跟在后面,这样更有逻辑性。
指定初始化器:
NS_DESIGNATED_INITIALIZER
属性
- 属性的参数顺序:原子性,读写 和 内存管理
- setter 方法中 KVO 通知(willChangeValueForKey, didChangeValueForKey) 会被自动执行。
- 懒加载是 KVO 不友好的,因为其在 getter 中 change value
- 永远不要在 init 方法(以及其他初始化方法)里面用 getter 和 setter 方法
方法
- 善用断言
- 私有方法不要用
_
前缀,这是 apple 保留前缀
相等性
- 你需要同时实现 isEqual 和 hash 方法。如果两个对象是被 isEqual 认为相等的,它们的 hash 方法需要返回一样的值。但是如果 hash 返回一样的值,并不能确保他们相等。
- 用
isEqualTo<#class-name-without-prefix#>:
这样的格式实现一个相等性检查方法。
Categories
- category 方法前加小写前缀以及下划线,比如
(id)zoc_myCategoryMethod
。
protocols
- 抽象接口
NSNotification
- 用类名前缀作为这个通知名字的前缀。
- 用一个 Did/Will 这样的动词以及用 “Notifications” 后缀来命名这个通知。
代码组织
利用代码块
善用 Pragma
明确编译器警告和错误
公开方法属性要有注释
对象通讯
block
- 若 objects 不为 nil,则 error 必须为 nil
- 若 objects 为 nil,则 error 必须不为 nil
注意避免 block 可能引起的循环引用问题,采用[@weakify/@strongify](https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h)
委托和数据源
- 代理方法必须以调用者(即委托者)作为第一个参数
- 避免双重引用
- 考虑用多重委托代替 NSNotifications。LBDelegateMatrioska
面向切面编程
Aspect Oriented Programming (AOP,面向切面编程),在 Objective-C 的世界里,这意味着使用运行时的特性来为指定的方法追加切面 。切面所附加的行为可以是这样的:
- 在类的特定方法调用前运行特定的代码
- 在类的特定方法调用后运行特定的代码
- 增加代码来替代原来的类的方法的实现
Aspects 库