《禅与Objective-C编程艺术》笔记

独奏

技术分享|2016-3-16|最后更新: 2023-2-23|

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)

    委托和数据源

    • 代理方法必须以调用者(即委托者)作为第一个参数
    • 避免双重引用

    面向切面编程

    Aspect Oriented Programming (AOP,面向切面编程),在 Objective-C 的世界里,这意味着使用运行时的特性来为指定的方法追加切面 。切面所附加的行为可以是这样的:
    • 在类的特定方法调用前运行特定的代码
    • 在类的特定方法调用后运行特定的代码
    • 增加代码来替代原来的类的方法的实现
    Loading...