2

因此,我知道 Objective-C 中的类别可用于向类添加方法,而无需子类化。我也明白这些类别不能用于向类添加实例变量。

我做了一点关于类扩展的阅读,它可用于添加实例变量,但我不明白如何使用类扩展来修改现有的类,例如 NSData。

我的问题如下:

我有一个包含 NSURL 和 NSData 的核心数据模型。NSData 显示 NSURL 的数据。当视图需要显示数据时,我会进行以下检查: --- 如果 [NSData bytes] > 0,则显示 NSData。--- 否则,在 NSURL 获取数据并在返回时显示数据

很简单。但是,当 NSURL 更新时,我遇到了问题。因此,如果我用新图像修改 NSURL 路径,因为 [NSData bytes] 已经大于 0,我不会进行额外调用来获取新图像。

我想做的是向 NSData 添加一个名为 URLKey 的实例变量,该变量将保存有关数据来源的信息。我不能继承 NSData,因为我使用的是 CoreData。

有谁知道一些简单的解决方案?也许我对类扩展的理解存在差距,或者也许没有简单的方法。

4

1 回答 1

2

类扩展应该用在你自己实现的类上,作为保持 ivars 和一些从头文件中隐藏的属性的方式,它应该只包含应该在类外可见的东西(而 ivars 不是那种东西)。

类别用于已经实现的类,作为添加附加功能的一种方式。当您想向已知类添加一般类型的行为时,通常需要它们。例如添加一个方法到 NSString +(NSString*)reversedString; 它返回一个反转的实例,因此您可以像这样使用它:

NSString *someString = @"string";
NSString *reverse = [someString reversedString]; 
NSLog(@"%@", someString); //this would output "gnirts"

.

关于您的特定问题,我可以向您保证,您的 CoreDataModel 不包含 NSURL 或 NSData。支持的类型是原始数据、字符串、二进制数据和可转换数据。因此,如果您愿意,可以将 NSData 或 NSURL 子类化,然后通过将类型设置为“可转换”来将其与 CoreData 一起使用。完成此操作后,您可以根据需要对 NSData 进行子类化,并在此过程中使用类扩展,或者仅使用类别将您需要的方法添加到类中。

引用 Apple 关于可转换属性的内容:

可转换属性背后的想法是将属性作为非标准类型访问,但在幕后 Core Data 使用 NSValueTransformer 的实例将属性与 NSData 的实例进行转换。然后 Core Data 将数据实例存储到持久存储中。

于 2012-01-26T15:34:02.770 回答