在调用超类的init方法后强制初始化超类的ivar

时间:2013-05-04 14:45:56

标签: objective-c cocoa

我需要在超类中强制执行ivar的初始化,但是如果没有要初始化的子类中的其他数据,则通常无法初始化ivar。我想到的两个解决方案是:

  1. 将所需的ivar生成密钥传递给超类的init方法
  2. 从子类的init方法
  3. 调用第二个超类方法

    以下是示例(人为的,非工作的)代码。应该从子类的键方法将stringBasedOnSubclassKey ivar初始化为NSString。

    @interface MySuperclass : NSObject
        @property (nonatomic, readonly) NSString *stringBasedOnSubclassKey;
    @end
    
    @interface MySubclass : MySuperclass
        @property (nonatomic, assign, readonly) int value;
    @end
    
    @implementation MySubclass
    
    - (instancetype)init
    {
        if (self = [super init]) {
            _value = 30;
        }
        return self;
    }
    
    - (NSString *)key
    {
        return [NSString stringWithFormat:@"UniqueKey-%d", self.value];
    }
    

    所以问题是有没有办法使用“key”方法的返回值强制执行stringBasedOnSubclassKey ivar的初始化?我不相信我可以执行上面的解决方案1和2。这些子类也可能由其他外部开发人员创建,因此关键方法可能比这更复杂。

    更新:我正在处理这个基类的现有子类,因此限制对现有子类的更改的解决方案是一个因素。

1 个答案:

答案 0 :(得分:1)

以强制初始化的方式编写stringBasedOnSubclassKey的getter:

- (NSString *) stringBasedOnSubclassKey {
    if !(_stringBasedOnSubclassKey) {
        _stringBasedOnSubclassKey = // whatever;
    }
    return _stringBasedOnSubclassKey;
}

编写超类key方法以抛出异常,从而强制客户端在子类中覆盖它。