自定义NSManagedObject setter类别

时间:2013-02-28 20:45:40

标签: ios objective-c cocoa-touch core-data nsmanagedobject

我已将所有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与不同的日志语句添加到同一个对象的第二个类别会发生什么?

1 个答案:

答案 0 :(得分:4)

加载程序时,运行时会知道所有类别方法。因此,如果您声明-[Item setName:]方法,则Core Data将不再在运行时创建此方法。

您无需导入任何内容,因为name已在Xcode生成的托管对象子类文件中声明为@dynamic属性。

如果两个类声明了相同的方法,或者类别中声明的方法的名称与原始类中的方法相同,则行为未定义,请参阅“使用目标编程”中的Avoid Category Method Name Clashes C”。