在运行时加载Objective C类有什么意义?

chm*_*chm 0 runtime objective-c memory-efficient objective-c-category

是吗:

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

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

我一直试图谷歌解决这个问题的答案,似乎只找到有关如何使用类别的资源,而不是为什么.如果你们中的任何一个人能指出我正确的方向,那将是非常棒的.

rob*_*off 5

类别的主要原因是允许您将方法添加到您没有源代码的类,或者您不想修改源代码的类.

例1.

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

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

例2.

Apple希望能够轻松地将字符串绘制到图形上下文中.在具有GUI的程序中,NSString使用绘制方法是合理的.Apple拥有Foundation框架(包含NSString)的源代码,因此可以添加它.但是Foundation框架旨在用于各种程序,包括没有任何用户界面的程序.因此,Foundation中的类对UIKit或AppKit或Core Graphics或任何其他可以绘制图形的高级库都不了解.

相反,UIKit有一个添加drawAtPoint:withFont:方法的类别NSString.AppKit有一个添加drawAtPoint:withAttributes:方法的类别NSString.

AppKit和UIKit有许多其他类别可以为Foundation类添加方法.例如,UIKit的上具有类别NSObject,NSIndexPath,NSCoder,等等.

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