2

我已将所有 NSManagedObject 的自定义逻辑放在一个类别中,这样当模型发生变化时,我就可以从模型中重新生成标准类。

我需要的一个这样的逻辑是对象属性之一的自定义设置器:

- (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?上面的日志语句仍然会触发。

只是好奇发送消息的类如何不需要知道逻辑仍然触发的类别?

并且(可能是一个单独的问题)如果我将具有不同日志记录语句的相同自定义设置器添加到同一对象的第二个类别会发生什么?

4

1 回答 1

4

加载程序时,所有类别方法都会被运行时知道。所以如果你声明了一个-[Item setName:]方法,那么 Core Data 将不再在运行时创建这个方法。

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

如果两个类别声明了相同的方法,或者如果类别中声明的方法名称与原始类中的方法相同,则行为未定义,请参阅“使用 Objective-C 编程”中的避免类别方法名称冲突

于 2013-02-28T21:08:59.760 回答