任何人可以区分何时使用委托而不是类别,反之亦然。我很清楚这一点。
由于
答案 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
委托类似于回调函数,