我有一個叫做Animal
的類,它是BaseEntity
的一個子類。我有一個名爲CoreDataConversions
的協議,其中Animal
和BaseEntity
都具有符合的類別。在協議我有定義的方法:在Objective-C類中調用`super`
- (instancetype)initWithManagedObject:(NSManagedObject *)managedObject dataManager:(id<DataManager>)dataManager
BaseEntity
類別實現此細。然後,因爲Animal
是BaseEntity
的一個子類別,我在動物類別中致電[super initWithManagedObject:managedObject dataManager:dataManager];
。
我得到一個崩潰與消息:
[Animal setDataManager:]
無法識別的選擇發送到實例...
我設置在通話超一個破發點,並記錄了以下工作:
po [self class] // Prints Animal
po [self superclass] // Prints BaseEntity
po [super class] // Prints Animal
po [super superclass] // Prints BaseEntity
所以:爲什麼Animal
類別的super
到撥打電話即使撥打superclass
明確提及BaseEntity
?
編輯:
下面是導致崩潰的代碼:我有一個測試,只需調用Animal *animal = [dataManager insertEntityForClass:[Animal class]];
然後斷言的animal
存在
- (id)insertEntityForClass:(Class)class
{
if (![class conformsToProtocol:@protocol(CoreDataConversions)]) {
return nil;
}
// A class method defined in CoreDataConversions
NSString *entityName = [class coreDataEntityName];
// Insert core data entity
NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.currentMainContext];
// Init with the managed object
id entity = [[class alloc] initWithManagedObject:managedObject dataManager:self];
return entity;
}
。
Animal
實現像這樣的方法:
- (instancetype)initWithManagedObject:(NSManagedObject *)managedObject dataManager:(id<RHDataManager>)dataManager
{
self = [super initWithManagedObject:managedObject dataManager:dataManager];
if (self) {
// TODO
}
return self;
}
而且BaseEntity
實現方法如下所示:
- (instancetype)initWithManagedObject:(id)managedObject dataManager:(id<RHDataManager>)dataManager
{
self = [super init];
if (self) {
self.dataManager = dataManager;
}
return self;
}
你可以在崩潰周圍發佈代碼,指出它所在的類。只是爲了使問題更清楚。 – danh
@danh只是在崩潰周圍添加了代碼 –
我可能會變得密集,但在發佈代碼中看不到'setDataManager'的調用 – danh