通知,代表和协议之间有什么区别?

时间:2011-08-19 08:01:20

标签: iphone objective-c delegates notifications protocols

协议或代表与NSNotifications之间有什么区别?什么是“观察者”以及它是如何运作的?

2 个答案:

答案 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

代表&amp;通知

文档:Cocoa Design Patterns

这是在对象之间传递消息的两种方法。主要区别:

  • 与代表一起,一个指定对象收到一条消息。
  • 任何数量的对象都可以在发布时收到通知。

代表通常使用协议实现:类通常具有类似

的类
@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中搜索找到答案......