在调用超类的初始化方法后强制初始化超类的伊娃

在调用超类的初始化方法后强制初始化超类的伊娃

问题描述:

我需要在超类中强制执行伊娃的初始化,但是如果没有其他数据要初始化,通常不能初始化伊娃。这两种方案我想到的是:在调用超类的初始化方法后强制初始化超类的伊娃

  1. 通为伊娃要求发电关键父类的init方法
  2. 从调用子类的init方法的第二个超类方法

下面是例子(人为的,非工作的)代码。 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]; 
} 

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

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

写出stringBasedOnSubclassKey吸气剂以这样的方式来强制初始化它:

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

,写超key方法抛出异常,因此强制客户端来覆盖它的子类。

+0

这是一个很好的解决方案,但我希望在对象初始化时执行初始化以避免if语句。它会被时间关键的代码调用数千次。我会分析一下,看看它是否真的在使用5000个呼叫中的if语句方面有很大的区别。 – dbainbridge 2013-05-04 16:25:49

+0

一个零检查完全没有时间。 - 但是,我的回答是基于对你的问题的误解。我认为重点是,直到初始化结束后才能知道密钥。如果你能*在初始化时执行它,那么当然在初始化时根据另一个答案执行它。 – matt 2013-05-04 16:43:37

+1

您的理解是正确的,因为我无法保证子类在完成初始化之前已完全初始化密钥。我能想到在init中执行的唯一方法是调用超类方法在子类init方法的末尾执行初始化。但我无法强制其他开发人员忘记在他们自己的子类中调用该方法。所以你的解决方案是最安全的,不需要现有的子类来改变。 – dbainbridge 2013-05-04 16:51:10