我有一个名为Animal
的类,它是BaseEntity
的子类。我有一个名为CoreDataConversions
的协议,Animal
和BaseEntity
都有符合的类别。在协议中,我有一个定义的方法:
- (instancetype)initWithManagedObject:(NSManagedObject *)managedObject dataManager:(id<DataManager>)dataManager
BaseEntity
类别实现了这一点。然后,因为Animal
是BaseEntity
的子类,所以我会在动物类别中调用[super initWithManagedObject:managedObject dataManager:dataManager];
。
我收到了一条消息:
[Animal setDataManager:]
无法识别的选择器已发送到实例...
我在调用super时设置了一个断点,并注销了以下内容:
po [self class] // Prints Animal
po [self superclass] // Prints BaseEntity
po [super class] // Prints Animal
po [super superclass] // Prints BaseEntity
所以:为什么Animal
类别的super
拨打Animal
,即使拨打superclass
明确提及BaseEntity
?
编辑:
以下是导致崩溃的代码:
- (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 :(得分:0)
事实证明这实际上与财产声明有关。我在原始类中定义了readonly
个属性,即@property (nonatomic, strong, readonly) id<DataManager> dataManager;
。
在类别中,我重新定义了属性,如下所示:
@property (nonatomic, strong) id<DataManager> dataManager;
导致崩溃是因为Animal
dataManager
中没有设置setter,因为它仍然以readonly
的形式读取它。