Iphone 向NSData添加实例变量

Iphone 向NSData添加实例变量,iphone,core-data,categories,class-extensions,Iphone,Core Data,Categories,Class Extensions,因此,我了解Objective-C中的类别可以用于向类添加方法,而无需子类化。我还理解,这些类别不能用于向类添加实例变量 我读了一些关于类扩展的书,它们可以用来添加实例变量,但是我不明白如何使用类扩展来修改现有的类,比如NSData 我的问题如下: 我有一个包含NSURL和NSData的核心数据模型。NSData显示NSURL的数据。当视图需要显示数据时,我执行以下检查: ---如果[NSData bytes]>0,则显示NSData。 ---否则,在NSURL获取数据,并在返回时显示数据 很简

因此,我了解Objective-C中的类别可以用于向类添加方法,而无需子类化。我还理解,这些类别不能用于向类添加实例变量

我读了一些关于类扩展的书,它们可以用来添加实例变量,但是我不明白如何使用类扩展来修改现有的类,比如NSData

我的问题如下:

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

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

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


有人知道一些简单的解决方法吗?也许我对类扩展的理解有差距,或者根本没有简单的方法。

类扩展应该用在您自己实现的类上,作为将IVAR和某些属性隐藏在头文件中的一种方法,头文件应该只包含在类外可见的内容(IVAR不是那种东西)

类别用于已实现的类,作为添加其他功能的一种方式。当您希望向已知类添加一般类型的行为时,通常需要类别。例如,向NSString+(NSString*)reversedString;添加一个方法,该方法返回一个反向实例,以便您可以像这样使用它:

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

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

引用苹果公司关于可转换属性的话:

可转换属性背后的思想是访问 属性作为非标准类型,但后台核心数据使用 NSValueTransformer的一个实例,用于将属性转换为 NSData的实例。核心数据然后将数据实例存储到 持久存储


你不能签入同时知道NSData和NSURL的托管对象吗?我可以,但我想把这个功能抽象出来,这样它就不依赖于特定的模型。这绝对是正确的方法。但是,我遇到了一些问题,因为NSData是一个类群集,所以我只创建了一个separate类,该类同时具有NSData属性和键,并以这种方式执行我的实现。