2016-10-16 29 views
-1

我有一個叫做Animal的類,它是BaseEntity的一個子類。我有一個名爲CoreDataConversions的協議,其中AnimalBaseEntity都具有符合的類別。在協議我有定義的方法:在Objective-C類中調用`super`

- (instancetype)initWithManagedObject:(NSManagedObject *)managedObject dataManager:(id<DataManager>)dataManager

BaseEntity類別實現此細。然後,因爲AnimalBaseEntity的一個子類別,我在動物類別中致電[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; 
} 
+0

你可以在崩潰周圍發佈代碼,指出它所在的類。只是爲了使問題更清楚。 – danh

+0

@danh只是在崩潰周圍添加了代碼 –

+1

我可能會變得密集,但在發佈代碼中看不到'setDataManager'的調用 – danh

回答

0

原來這實際上是財產申報的事情。我有readonly屬性,即在原始類中定義的@property (nonatomic, strong, readonly) id<DataManager> dataManager;

該類別中的我已經重新定義屬性,像這樣:因爲當時沒有二傳手在AnimaldataManager設置,因爲它仍然在讀它爲readonly

@property (nonatomic, strong) id<DataManager> dataManager;

初步判斷此次失事造成的。

相關問題