0
我需要在超類中強制執行伊娃的初始化,但是如果沒有其他數據要初始化,通常不能初始化伊娃。這兩種方案我想到的是:在調用超類的初始化方法後強制初始化超類的伊娃
- 通爲伊娃要求發電關鍵父類的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。這些子類也可能由其他外部開發人員創建,所以關鍵方法可能比這更復雜。
更新:我正在處理此基類的現有子類,因此限制對現有子類的更改的解決方案是一個因素。
這是一個很好的解決方案,但我希望在對象初始化時執行初始化以避免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