2010-08-10 36 views
1

我有三個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中的ClassBClassC實例實際上創建。是否爲ClassBClassC取決於由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方法中),重置對象爲時已晚。

回答

3
  1. 是的我認爲它會被泄漏,因爲它在alloc後保留+1,但沒有任何東西會釋放它。

  2. 在重新分配self的值之前,您可以使用[self release]。有人認爲直接應該是[self dealloc],但我個人更喜歡前者。

  3. 從筆尖實例化的對象發送initWithCoder:消息我認爲,所以覆蓋,而不是init。雖然在這一點上,我還不確定是否會設置delegate

+0

你確定那第三個嗎?爲了使'initWithCoder:'工作,類需要實現'NSCoding'協議,NSObject默認情況下不支持這種協議,我的類也不做,但我沒有任何問題在InterfaceBuilder中創建任何實例。另外,當我在IB中創建'ClassA'時,它經歷了我在上面發佈的兩次初始化調用 - 首先是本身,然後是從'ClassC'調用'[super init]'。 – executor21 2010-08-10 17:58:06

相關問題