面试题答案
一键面试代理模式
- 设计原理:代理模式是一种对象的结构模式。在代理模式中,一个对象代表另一个对象来提供服务。它通过定义一个协议(Protocol),让代理对象遵循该协议,从而实现对委托对象特定行为的代理。委托对象持有代理对象的引用,当特定事件发生时,委托对象调用代理对象遵循协议的方法,完成相应操作。
- 使用方式:
- 定义协议:
@protocol MyProtocol <NSObject>
- (void)doSomething;
@end
- 代理对象遵循协议:
@interface MyDelegate : NSObject <MyProtocol>
@end
@implementation MyDelegate
- (void)doSomething {
NSLog(@"Delegate did something.");
}
@end
- 委托对象设置代理并调用代理方法:
@interface MyClass : NSObject
@property (nonatomic, weak) id<MyProtocol> delegate;
- (void)triggerAction;
@end
@implementation MyClass
- (void)triggerAction {
if ([self.delegate respondsToSelector:@selector(doSomething)]) {
[self.delegate doSomething];
}
}
@end
在使用时:
MyClass *obj = [[MyClass alloc] init];
MyDelegate *delegate = [[MyDelegate alloc] init];
obj.delegate = delegate;
[obj triggerAction];
- 适用场景:当需要一对一的交互,且交互逻辑较为明确,希望在特定对象间进行紧密的控制和反馈时优先选择代理模式。例如,UITableView的数据源和代理,用于提供数据和处理用户交互,一个UITableView只需要一个数据源和代理,它们之间紧密协作。
通知中心
- 设计原理:通知中心(NSNotificationCenter)是一种观察者模式的实现。它提供了一种广播机制,允许对象在不了解接收者的情况下,将特定事件通知给多个感兴趣的对象。通知中心维护一个通知队列,当一个对象发布通知时,通知中心会将该通知发送给所有注册监听该通知的对象。
- 使用方式:
- 注册监听通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"MyNotification" object:nil];
- (void)handleNotification:(NSNotification *)notification {
NSLog(@"Received notification: %@", notification);
}
- 发布通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:nil userInfo:@{@"key": @"value"}];
- 适用场景:当一个事件可能会影响到多个不相关的对象,且不需要紧密耦合的控制和反馈时,选择通知中心。比如,应用进入后台或前台时,多个不同模块可能都需要做出响应,此时使用通知中心发布相关通知,各模块注册监听即可。
关键差异
- 实现差异:
- 代理模式:通过协议定义方法,委托对象持有代理对象的弱引用,通过判断代理是否实现了相应方法来调用。
- 通知中心:通过注册观察者和发布通知来实现,观察者和发布者之间没有直接引用关系,通过通知名称来匹配。
- 使用差异:
- 代理模式:一对一交互,更注重对象间的紧密协作和控制,适合处理特定对象间的业务逻辑。
- 通知中心:一对多广播,更适合松散耦合的事件通知,适合跨模块的事件响应场景。