协议或代表与NSNotifications之间有什么区别?什么是“观察者”以及它是如何运作的?
答案 0 :(得分:30)
文档:Protocols
协议是定义对象响应的某些方法的接口。协议的关键是它们可以被任何类采用,保证对象响应这些方法。
如果宣布协议:
@protocol Photosynthesis
@required
- (void)makeFood:(id<Light>)lightSource;
@optional
+ (NSColor *)color; // usually green
@end
然后你可以从其他不一定直接相关的类中采用它:
@interface Plant : Eukaryote <Photosynthesis>
// plant methods...
@end
@implementation Plant
// now we must implement -makeFood:, and we may implement +color
@end
或
@interface Cyanobacterium : Bacterium <Photosynthesis>
// cyanobacterium methods...
@end
@implementation Cyanobacterium
// now we must implement -makeFood:, and we may implement +color
@end
现在,在其他地方,如果我们只关心协议的符合性,我们可以互换使用这些类中的任何一个:
id<Photosynthesis> thing = getPhotoautotroph(); // can return any object, as long as it conforms to the Photosynthesis protocol
[thing makeFood:[[Planet currentPlanet] sun]]; // this is now legal
这是在对象之间传递消息的两种方法。主要区别:
代表通常使用协议实现:类通常具有类似
的类@property (weak) id<MyCustomDelegate> delegate;
为代表提供了一组实现的方法。你可以使用
myObject.delegate = /* some object conforming to MyCustomDelegate */;
然后该对象可以向其委托发送相关消息。有关常见示例,请参阅UITableViewDelegate protocol。
另一方面,通知是使用NSNotificationCenter实现的。一个对象(或多个对象)只是将自己添加为特定通知的观察者,然后在被另一个对象发布时可以接收它们。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(notificationHappened:)
name:MyCustomNotificationName
object:nil];
然后执行
- (void)notificationHappened:(NSNotification *)notification {
// do work here
}
您可以使用
从任何地方发布通知[[NSNotificationCenter defaultCenter] postNotificationName:MyCustomNotificationName
object:self
userInfo:nil];
确保在完成后致电removeObserver:
!
答案 1 :(得分:5)
您可以通过在stackoverflow中搜索找到答案......