gpt4 book ai didi

ios - 为什么 NSManagedObject 子类不能使用 class_copyMethodList 找到动态生成的方法?

转载 作者:行者123 更新时间:2023-11-29 01:12:37 26 4
gpt4 key购买 nike

当我创建一个 NSManagedObject 子类 Employee 时,根据 xcdatamodel 文件中的 EntityDescription,它有一个属性 name。在 .m 文件中,代码使用 @dynamic 修改它,如下所示:

@interface Employee (CoreDataProperties)

@property (nullable, nonatomic, retain) NSString *name;

@end


@implementation Employee (CoreDataProperties)

@dynamic name;

@end

根据 Apple 文档:

Core Data dynamically generates efficient public and primitive get and set attribute accessor methods and relationship accessor methods for properties that are defined in the entity of a managed object’s corresponding managed object model. Therefore, you typically don’t need to write custom accessor methods for modeled properties.

据此,我认为 CoreData 框架将在运行时创建两个名为 namesetName: 的方法。所以我用这样的代码来验证我的想法。

Employee *object = [NSEntityDescription   insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
object.name = @"1";
[[self class] showInstanceMethod:[Employee class]];

+ (void)showInstanceMethod:(Class)class {
unsigned int outCount;
//..show InstanceMethodList
Method *methodsList = class_copyMethodList(class, &outCount);
for (int i = 0; i < outCount; i ++) {
SEL sel = method_getName(*methodsList);
NSString *methodName = NSStringFromSelector(sel);
NSLog(@"\nmethodName:%@\n", methodName);
methodsList++;
}
}

我很遗憾它没有记录任何方法名称,如 namesetName:。但我使用此代码 object.name = @"1 "; 没有任何问题。

最佳答案

当他们说“动态”时,他们确实是这个意思——动态实现似乎只在调用选择器时提供(直接或通过 valueForKey:)。如果您在 Employee 类中重写 resolveInstanceMethod:,您就会看到这种情况发生。调用 super 实现并记录选择器名称和返回值。据推测,该方法此时将由 class_copyMethodList 列出,尽管我从未检查过。

关于ios - 为什么 NSManagedObject 子类不能使用 class_copyMethodList 找到动态生成的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35572375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com