2009-05-25 10 views
12

私はちょうどinitメソッドで正しく失敗する方法を読んできました。そして、ドキュメントはお互いに同意していないようです。例外をスローすることをお勧めしますが、他の人は、クリーンアップとnilの返却を推奨しています。現在のベストプラクティスは何ですか?initメソッドの[self release]、[self dealloc]または[super dealloc]?

答えて

16

一般的に受け入れられている方法は、失敗した場合にnilを返すことです。しかし、あなたは、リークを避けるために、自己を解放したいん:例外の

-(id)init 
{ 
    if (self = [super init]) { 
    ... 
    if (thingsWentWrong) { 
     [self release]; 
     return nil; 
    } 
    ... 
    } 
    return self; 
} 
+0

フィードバックをお寄せいただきありがとうございます。これは私がやっていることであり、適切なアプローチだと思っていましたが、ドキュメント内の他の2つのメソッドへの参照は、私が気づいている特別なケースがあるかもしれないと思っていました。 – Kevin

0

私が常に使用してきた方法は、クリーンアップしてnilを返すことです。あなたの質問のタイトルで言及した3つのメソッドは、コール階層内のsegfaultをより高くすることがありますが、nilを返すことはできません。私は、アップル社のドキュメントは、失敗しても何も返さないと言います。矛盾をどこで見つけていますか?

+2

nilを返すだけでメモリがリークします。これは、allocの呼び出しによって保持カウントが1のオブジェクトが作成されるためです。 –

+0

メモリリークは私が避けたいものです。ドキュメントへ – Kevin

+0

リンク:初期化中 エラー検出 - http://tr.im/mlyA 初期化子を実装 - http://tr.im/mlyX あなたは第2のリンクのサンプルコードの下にそのことに気づくでしょう代わりに例外をスローすることをお勧めします。私はそれが現在のベストプラクティスではないと確信しています。 – Kevin

6

Cocoaの哲学は、彼らが唯一の方法に不正な引数を渡すように、プログラマエラーである状況でスローされるべきであるということです。何かがうまくいかない場合、メソッドは単にNOまたはnilを返し、NSError ** "out"パラメータを使用して詳細を報告してください。

これには、最初のメソッドが含まれます。エラーの状況が、完成した製品で正当に発生する可能性のあるものである場合、メソッドは自己をリリースしてリークを回避し、ゼロを返さなければなりません。

9

適切な解決策(例外および/または[self release]; return nil;)が適用されているので、私は間違った解決方法を取り上げます。

deallocを直接送信しないでください。それはreleaseさんの仕事です。 (あなたのコードがGCの下で実行されている場合は、deallocは適用できません。問題の原因を特定するにはどうすればよいでしょうか?)

superを直接使用しないでください。それはあなた自身のdeallocの実装をスキップします。

関連する問題