/ / Warum kann die NSManagedObject-Unterklasse nicht die dynamisch generierte Methode class_copyMethodList verwenden? - ios, Ziel-c, Kerndaten

Warum kann die NSManagedObject-Subklasse die dynamisch generierte Methode class_copyMethodList nicht finden? - ios, Ziel-c, Kerndaten

Wenn ich eine NSManagedObject-Unterklasse erstelle EmployeeEs hat eine Eigenschaft namenach der EntityDescription in xcdatamodelDatei. Und in der .m-Datei ändern Sie den Code mit @dynamic so was:

@interface Employee (CoreDataProperties)

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

@end


@implementation Employee (CoreDataProperties)

@dynamic name;

@end

Nach dem Apple-Dokument:

Core Data generiert dynamisch effiziente publicund primitive Methoden zum Abrufen und Festlegen von Attribut-Zugriffsmethoden und Beziehungs-Zugriffsmethoden für Eigenschaften, die in der Entität des entsprechenden verwalteten Objektmodells eines verwalteten Objekts definiert sind. Daher müssen Sie in der Regel keine benutzerdefinierten Zugriffsmethoden für modellierte Eigenschaften schreiben.

Dementsprechend denke ich, dass das CoreData Framework zwei benannte Methoden erstellen wird name und setName:in der Laufzeit. Also verwende ich einen solchen Code, um mein Denken zu überprüfen.

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++;
}
}

Ich bin traurig, dass es keinen Methodennamen wie name oder setName:. Aber ich benutze diesen Code object.name = @"1"; und hatte kein Problem.

Antworten:

1 für die Antwort № 1

Wenn sie "dynamisch" sagen, dann meinen sie es wirklich - die dynamische Implementierung scheint nur dann bereitgestellt zu werden, wenn der Selektor aufgerufen wird (direkt oder über valueForKey:). Sie können dies beobachten, wenn Sie überschreiben resolveInstanceMethod: in deinem Employee Klasse. Rufen Sie die Superimplementierung auf und protokollieren Sie den Selektornamen und den Rückgabewert. Vermutlich wird die Methode nach aufgelistet class_copyMethodList an dieser Stelle, obwohl ich nie überprüft habe.