面试题答案
一键面试- 定义被观察对象(Subject):
- 首先创建一个被观察对象类,它需要维护一个观察者数组,并提供注册、通知和解除注册的方法。
#import <Foundation/Foundation.h> @class Observer; @interface Subject : NSObject - (void)registerObserver:(Observer *)observer; - (void)unregisterObserver:(Observer *)observer; - (void)notifyObservers; @end @implementation Subject { NSMutableArray<Observer *> *_observers; } - (instancetype)init { self = [super init]; if (self) { _observers = [NSMutableArray array]; } return self; } - (void)registerObserver:(Observer *)observer { [_observers addObject:observer]; } - (void)unregisterObserver:(Observer *)observer { [_observers removeObject:observer]; } - (void)notifyObservers { for (Observer *observer in _observers) { [observer update]; } } @end
- 定义观察者(Observer):
- 观察者类需要有一个接收通知的方法。
#import <Foundation/Foundation.h> @class Subject; @protocol ObserverProtocol <NSObject> - (void)update; @end @interface Observer : NSObject <ObserverProtocol> - (instancetype)initWithSubject:(Subject *)subject; @end @implementation Observer { Subject *_subject; } - (instancetype)initWithSubject:(Subject *)subject { self = [super init]; if (self) { _subject = subject; [_subject registerObserver:self]; } return self; } - (void)update { NSLog(@"Observer received notification."); } - (void)dealloc { [_subject unregisterObserver:self]; } @end
- 使用示例:
- 在
main
函数中展示如何使用观察者模式。
int main(int argc, const char * argv[]) { @autoreleasepool { Subject *subject = [[Subject alloc] init]; Observer *observer = [[Observer alloc] initWithSubject:subject]; [subject notifyObservers]; // 如果想手动解除注册 [subject unregisterObserver:observer]; [subject notifyObservers]; } return 0; }
- 在
在上述代码中:
- 注册观察者:在
Observer
的initWithSubject:
方法中,调用[subject registerObserver:self]
将自身添加到Subject
的观察者数组中。 - 通知观察者:
Subject
的notifyObservers
方法遍历观察者数组,对每个观察者调用update
方法。 - 解除注册:
Subject
的unregisterObserver:
方法从观察者数组中移除指定的观察者。在Observer
的dealloc
方法中,也会自动解除注册,以防止内存泄漏。