代表团超过类别

时间:2011-05-13 05:42:27

标签: iphone objective-c categories delegation

任何人可以区分何时使用委托而不是类别,反之亦然。我很清楚这一点。

由于

3 个答案:

答案 0 :(得分:5)

Category允许在类上添加新方法或覆盖现有方法,从而允许在没有子类化的情况下扩展类。添加方法是最有用的目标,如果你不确切地知道扩展的类是什么,那么覆盖可能会出错。

它更像是一种语言特征而非模式,它适用于每个类。

委托是一种模式而不是语言特征,应该为其使用的类编码,否则它将无效。

通常,委托人需要实现将要接收委托的类所知的协议。然后,该类将使用委托来执行其编码的内容,其中一些最常见的是使用策略模式的一部分发送通知,即在代码的某些部分中询问问题以根据具体委托的实现做出决策,让委托执行一个动作或它们的任意组合。

例如UIApplicationDelegate是通知(application:didFinishLaunchingWithOptions:)和操作(application:openURL:sourceApplication:annotation:)协议,UITextFieldDelegate是通知(textFieldDidBeginEditing:)和策略(textField:shouldChangeCharactersInRange:replacementString:

实际上,我可以想象使用类别来实现上述所有这些情况下的委托:发送通知,执行操作,参与策略。但它需要你非常好地知道扩展类正在做什么,可能要有代码,否则你可以很容易地破坏类或被更改的类实现打破。所以这种用法在我看来是非常错误的。

答案 1 :(得分:1)

类别:将方法添加到现有

委托:通过允许其他对象(委托)参与对象的操作来修改另一个对象的行为。

假设您有一个包含三个表的iOS应用程序。尽管它们的配置方式相同,但如果这些表具有不同的委托,则每个表的行为可能会有所不同。

您不能对类别执行此操作,因为类别同样适用于它所扩展的类的所有实例。另一方面,如果要扩展UITableView类以添加一些新功能,则需要类别*。代表是特定于实例的,并且仅限于委派类的设计者为他们设想的角色。

当然,

*或子类。

答案 2 :(得分:-3)

当您需要在不创建子类的情况下扩展类时使用类别,例如,当您需要将一个名为isURL的方法添加到NSString时,您可以按如下方式使用类别,这里我们不创建子类,而是正在扩展实施。

@interface NSString (Utilities) 
- (BOOL) isURL; 
@end 

委托类似于回调函数,