2011-07-27 79 views
3

當我的自定義初始化程序失敗時,我應該返回nil。清理我在初始化程序中分配的任何內存的約定是什麼,我期待的會在dealloc中清理?如何在自定義初始化失敗時清理內存

這裏是一個人爲的例子:

- (id)init 
{ 
    if ((self = [super init])) { 
     instanceVar1 = [[NSString alloc] initWithString:@"blah"]; 
     if (bad_thing_oh_noes) { 
      return nil; 
     } 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [instanceVar1 release]; 

    [super dealloc]; 
} 

更現實的情況下,我不能有效地檢查每個錯誤條件之前,我做分配將被反序列化含陣列等一個複雜的對象。

無論如何,我在返回nil之前清理分配的內存,在返回nil之前是否向自己發送dealloc消息,或者這些都是爲我管理的嗎?

回答

2

如果在初始化過程中發生錯誤,應該調用releaseself並返回nil

if (bad_thing_oh_noes) { 
    [self release]; 
    return nil; 
} 

而且,你必須確保它是安全的調用部分初始化的對象dealloc

只有在故障點時才應撥打release。如果您從超類的初始值設定程序返回nil,則不應調用release

通常情況下,初始化失敗時不應拋出異常。

Handling Initialization Failure一個例子:

- (id)initWithURL:(NSURL *)aURL error:(NSError **)errorPtr { 

    self = [super init]; 
    if (self) { 

     NSData *data = [[NSData alloc] initWithContentsOfURL:aURL 
             options:NSUncachedRead error:errorPtr]; 

     if (data == nil) { 
      // In this case the error object is created in the NSData initializer 
      [self release]; 
      return nil; 
     } 
     // implementation continues... 
+0

我傻,我想我通過閱讀文件,但我錯過了回答我的問題的一部分!感謝您爲我清理這個。 :-) – Sandy

+0

@Sandy歡迎您:) – albertamg