为什么要使用类别而不是子类?

Why would you use categories over subclasses?

我只是想弄清楚类别与 subclassing 相比的优势...我确实了解它们是如何实现的,但我目前看到的唯一优势是,它可以节省如果您想在以后的阶段扩展一个使用过的 class,那么您就可以重构整个代码,这通常不应该通过良好的计划来实现。否则它需要大约相同的时间来实现 subclass 并且它并没有真正带来不同的功能。因此,根据我对 subclasses 与类别的了解,我看不出为什么要使用类别。有人可以洗头并解释类别存在的原因吗?我会非常感激:)

尝试向 NSString 添加新方法 class。尝试通过 subclassing NSString 和添加类别来实现。其中一个需要两分钟,另一个你永远无法正常工作。那将回答你的问题。

一个主要区别是category不能添加实例变量,sub类可以。

此外还有 类 很难进行子类化,例如 NSString,请参阅子类化说明。以下是摘录:"It is possible to subclass NSString (and NSMutableString), but doing so requires providing storage facilities for the string (which is not inherited by subclasses) and implementing two primitive methods."当你看到你就知道这并不容易。

您专注于您创建的对象,在这种情况下,subclassing 就可以了。但是,如果您调用 Cocoa 某个标准对象的 returns 方法怎么办?您是否希望每次都必须创建 subclass 的新实例才能使用您的新方法?不,能够创建通过类别添加到现有 class 的方法要方便得多。

此外,您可能希望您的新方法不仅适用于基础 class,而且适用于其所有子 classes(例如,如果您将扩展添加到 NSString,它也适用于 NSMutableString 个实例。

有关详细信息,请参阅 Objective-C 指南中的 Customizing Existing Classes 中的讨论。