类别中的自定义 NSManagedObject 设置器

Posted

技术标签:

【中文标题】类别中的自定义 NSManagedObject 设置器【英文标题】:Custom NSManagedObject setter in category 【发布时间】:2013-02-28 20:45:40 【问题描述】:

我已将所有 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?上面的日志语句仍然会触发。

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

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

【问题讨论】:

您的类别是否在您模型的.h 文件中声明? 否 - 假设您的意思是“它是否在核心数据生成的 .h 中声明”。 【参考方案1】:

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

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

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

【讨论】:

以上是关于类别中的自定义 NSManagedObject 设置器的主要内容,如果未能解决你的问题,请参考以下文章

需要继承 NSManagedObject 的自定义类的子类

NSManagedObject 子类的自定义初始化

TableView 的自定义复选框给出 NSManagedObject 错误

Swift:CoreData NSManagedObject 的自定义设置器

php 通过acf选择字段查询类别中的自定义帖子类型

php 通过acf选择字段查询类别中的自定义帖子类型