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++ 项目更容易拆分和重构(如果不算那堆头文件的话)。