2011-07-27 9 views
3

私のカスタムイニシャライザが失敗すると、私はnilを返すことになっています。私が初期化子で割り当てたメモリをクリーンアップするための規約は何ですか?私はdeallocでクリーンアップされることを期待していましたか?私は、割り当ては、配列を含む複雑なオブジェクトをデシリアライズなどされるだろうか前に私が効率的にすべてのエラー状態をチェックすることはできませんカスタムinitが失敗したときにメモリをクリーンアップする方法

- (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を返す前にselfにdeallocメッセージを送信するのですか、それともすべてが魔法のために管理されていますか?

答えて

2

イニシャライザでエラーが発生した場合は、selfreleaseと呼び出し、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

関連する問題