0

是吗:

为了提高内存效率,不必一直将所有程序的方法存储在 RAM 中?如果是这样,这真的是一个普遍的问题吗?我觉得必须加载新方法的开销会抵消正常大小程序的内存节省,尽管我可以看到它对非常大的程序有什么帮助。

为了增加灵活性?如果是这样,你能举一个例子吗?我发现很难想出一个。

我一直在尝试用谷歌搜索这个问题的答案,但似乎只找到有关如何使用类别而不是为什么使用的资源。如果你们中的任何一个人能指出我正确的方向,那就太棒了。

4

2 回答 2

5

类别的主要原因是允许您向没有源代码或不想修改源代码的类添加方法。

示例 1。

UIImage我想要一种通过加载动画 GIF来创建动画的方法。从逻辑上讲,这应该是一个UIImage类方法,但我没有 UIKit 框架的源代码(其中包含UIImage)。所以我写了一个类别,UIImage它添加了一个名为animatedImageWithAnimatedGIFData:. 您可以在我的uiimage-from-animated-gif存储库中找到它。

我必须将此方法添加到UIImage吗?不,我可以让它成为一个常规的 C 函数,或者我可以创建一个实用程序类(也许命名为AnimatedGIFLoader)来保存该方法。但从设计的角度来看,该方法在逻辑上属于UIImage.

示例 2。

Apple 希望让将字符串绘制到图形上下文中变得容易。在带有 GUI 的程序中,NSString有一个 draw 方法是合理的。Apple 拥有 Foundation 框架的源代码(其中包含NSString),因此他们可以添加它。但是 Foundation 框架被设计用于各种程序,包括没有任何用户界面的程序。因此 Foundation 中的类对 UIKit 或 AppKit 或 Core Graphics 或任何其他可以绘制图形的更高级别库一无所知。

相反,UIKit 有一个将drawAtPoint:withFont:方法添加到NSString. AppKit 有一个将drawAtPoint:withAttributes:方法添加到NSString.

AppKit 和 UIKit 有许多其他类别,它们向 Foundation 类添加方法。例如,UIKit 在NSObjectNSIndexPathNSCoder等上有类别。

使用类别的另一个原因是将类的实现拆分为多个.m文件。如果你有一个大类,你可以将它的一些选择器移动到一个类别中,并在一个单独的源文件中实现类别方法。链接器在创建可执行文件时会自动将类别合并到类中,因此没有运行时损失。

于 2012-10-11T02:38:03.950 回答
0

动态加载类别的一个原因是有条件地这样做。我用它来兼容不同版本的操作系统。

例如,较新版本的系统框架提供了一些我想使用的不错的功能。但是,我的目标是部署到早期版本的操作系统。我可以为旧版本实现(部分)替换新功能,但我想在新版本上使用系统代码。因此,我实现了一个类别,它提供了我对新方法的实现,但我只在旧系统上加载它。我必须避免在较新版本的操作系统上加载它,因为如果我这样做了,该类别将取代系统提供的方法。

于 2014-07-06T17:58:26.560 回答