第十一章:设计的哲学 —— OC 的七种武器

11.1 单例(Singleton):只有一个

OC 的单例写起来很有仪式感:

+ (instancetype)sharedInstance {
    static MyClass *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[super allocWithZone:NULL] init];
    });
    return instance;
}

dispatch_once 保证了线程安全,保证了只会执行一次。这是最标准的写法。

11.2 代理(Delegate):一对一的纠缠

前面说过,Delegate 是为了解耦。 WebView 即使不知道正在使用它的是哪个 ViewController,也能通过 id<UIWebViewDelegate> 告诉外面:“网页加载完了”。 弱引用(weak property)是关键,否则两个对象互相抱着对方的大腿(Retain Cycle),谁也死不掉。

11.3 通知(Notification):一对多的广播

NSNotificationCenter 是一个大喇叭。 只要你注册了监听,我不认识你,我还是能发消息给你。 适用于:登录成功、键盘弹出、APP 进入后台这些全局事件。 记得在 dealloc 里移除监听(虽然 iOS 9 以后系统自动帮你做了,但老习惯很难改)。

11.4 KVO (Key-Value Observing):暗中观察

OC 允许你观察任意对象的任意属性的变化。 [person addObserver:self forKeyPath:@"name" ...] 这在实现 MVVM(Model-View-ViewModel)架构时非常有用。 不用写任何回调代码,只要 Model 变了,View 自动就变了。

11.5 总结

OC 的设计模式非常推崇 松耦合。 无论是 Delegate 还是 Runtime 消息机制,都在试图让对象之间的连接变得没那么“僵硬”。 这种哲学让 OC 的代码往往比 C++ 项目更容易拆分和重构(如果不算那堆头文件的话)。

使用 Hugo 构建
主题 StackJimmy 设计