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

独奏

技术分享|2016-3-16|最后更新: 2023-2-23|
type
status
date
slug
summary
tags
category
icon
password

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 的世界里,这意味着使用运行时的特性来为指定的方法追加切面 。切面所附加的行为可以是这样的:
    • 在类的特定方法调用前运行特定的代码
    • 在类的特定方法调用后运行特定的代码
    • 增加代码来替代原来的类的方法的实现