我有三個Objective-C類:在Objective-C中,init方法設置self時原始對象會發生什麼?
@interface ClassA : NSObject{
IBOutlet id<ClassAProtocol>delegate
//other instance variables
}
//methods
@end
@interface ClassB : ClassA{
//instance variables
}
//methods
@end
@interface ClassC : ClassA{
//instance variables
}
//methods
@end
我的目標是讓當ClassA
一個實例是要求在代碼或InterfaceBuilder中的ClassB
或ClassC
實例實際上創建。是否爲ClassB
或ClassC
取決於由delegate
對象執行的ClassAProtocol
中方法的返回值。
@implementation ClassA
static BOOL _initFromSubclass = NO;
-(id)init{
if(_initFromSubclass){
_initFromSubclass = NO;
self = [super init];
}else {
_initFromSubclass = YES;
if([delegate shouldInitClassB]){
self = [[ClassB alloc] init];
}else{
self = [[ClassC alloc] init];
}
}
return self;
}
//other methods
@end
這不工作,我因爲在初始化調用想要的方式,委託(Interface Builder中設置)仍然是零,所以創建的對象始終是ClassC
。此外,首先創建一個ClassA
對象,然後在其init調用中創建一個具有不同內存地址的新對象ClassC
,並且不處理對象。我有三個問題:
1)原始對象ClassA
會發生什麼? (我認爲它泄露了,但我想知道)。
2)如何避免泄漏?
3)我如何完成我真正想要的?在設置代理時(例如,在awakeFromNib
方法中),重置對象爲時已晚。
你確定那第三個嗎?爲了使'initWithCoder:'工作,類需要實現'NSCoding'協議,NSObject默認情況下不支持這種協議,我的類也不做,但我沒有任何問題在InterfaceBuilder中創建任何實例。另外,當我在IB中創建'ClassA'時,它經歷了我在上面發佈的兩次初始化調用 - 首先是本身,然後是從'ClassC'調用'[super init]'。 – executor21 2010-08-10 17:58:06