2016-10-16 4 views
-1

私はAnimalというクラスを持っています。これはBaseEntityのサブクラスです。私はAnimalBaseEntityの両方に準拠するカテゴリを持つCoreDataConversionsというプロトコルを持っています。プロトコルでは、私は、メソッドが定義されている: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を参照していますか?

EDIT:

は、ここでのクラッシュの原因となるコードです:

- (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 *animal = [dataManager insertEntityForClass:[Animal class]];を呼び出し、animalの存在を主張するテストを持っています。

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;を元のクラスに定義しました。

私はそうのようなプロパティを再定義したカテゴリにザ・:それはまだreadonlyとしてそれを読んでいたので、dataManagerためAnimalに設定された何のセッターがなかったので、

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

クラッシュが発生しました。

関連する問題