我已将所有NSManagedObject的自定义逻辑放在一个类别中,这样我就可以从模型中重新生成标准类,如果它发生变化的话。
我需要的一个逻辑是在对象的一个属性上自定义setter:
- (void) setName:(NSString *)name
{
[self willChangeValueForKey:@"name"];
[self setPrimitiveValue:name forKey:@"name"];
[self didChangeValueForKey:@"name"];
NSLog(@"name was changed");//for example
}
我已将此放在类别中,在本例中为Item+Custom.m
我的问题:
为什么每当我设置一个Item的名称时,导入Item + Custom.m都需要 ?上面的日志声明仍然会触发。
只是好奇发送消息的类不需要知道仍然触发逻辑的类别?
并且(可能是一个单独的问题)如果我将同一个自定义setter与不同的日志语句添加到同一个对象的第二个类别会发生什么?
答案 0 :(得分:4)
加载程序时,运行时会知道所有类别方法。因此,如果您声明-[Item setName:]
方法,则Core Data将不再在运行时创建此方法。
您无需导入任何内容,因为name
已在Xcode生成的托管对象子类文件中声明为@dynamic
属性。
如果两个类声明了相同的方法,或者类别中声明的方法的名称与原始类中的方法相同,则行为未定义,请参阅“使用目标编程”中的Avoid Category Method Name Clashes C”。