在Objective-C类别中调用`super`

时间:2016-10-16 14:38:21

标签: objective-c categories superclass super

我有一个名为Animal的类,它是BaseEntity的子类。我有一个名为CoreDataConversions的协议,AnimalBaseEntity都有符合的类别。在协议中,我有一个定义的方法:

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

BaseEntity类别实现了这一点。然后,因为AnimalBaseEntity的子类,所以我会在动物类别中调用[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;
}

1 个答案:

答案 0 :(得分:0)

事实证明这实际上与财产声明有关。我在原始类中定义了readonly个属性,即@property (nonatomic, strong, readonly) id<DataManager> dataManager;

在类别中,我重新定义了属性,如下所示:

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

导致崩溃是因为Animal dataManager中没有设置setter,因为它仍然以readonly的形式读取它。