在调用超类的初始化方法后强制初始化超类的伊娃
问题描述:
我需要在超类中强制执行伊娃的初始化,但是如果没有其他数据要初始化,通常不能初始化伊娃。这两种方案我想到的是:在调用超类的初始化方法后强制初始化超类的伊娃
- 通为伊娃要求发电关键父类的init方法
- 从调用子类的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
方法抛出异常,因此强制客户端来覆盖它的子类。
这是一个很好的解决方案,但我希望在对象初始化时执行初始化以避免if语句。它会被时间关键的代码调用数千次。我会分析一下,看看它是否真的在使用5000个呼叫中的if语句方面有很大的区别。 – dbainbridge 2013-05-04 16:25:49
一个零检查完全没有时间。 - 但是,我的回答是基于对你的问题的误解。我认为重点是,直到初始化结束后才能知道密钥。如果你能*在初始化时执行它,那么当然在初始化时根据另一个答案执行它。 – matt 2013-05-04 16:43:37
您的理解是正确的,因为我无法保证子类在完成初始化之前已完全初始化密钥。我能想到在init中执行的唯一方法是调用超类方法在子类init方法的末尾执行初始化。但我无法强制其他开发人员忘记在他们自己的子类中调用该方法。所以你的解决方案是最安全的,不需要现有的子类来改变。 – dbainbridge 2013-05-04 16:51:10