2012-03-24 3 views
7

かなり簡単な質問:Obj-C:NSError in initialiser

私のクラスには、間違ってしまう可能性のあるinitメソッドがあります。もしそうなら、私は "返す"ことを計画していますが、私はエラーを返すこともしたいと思います。 initメソッドにNSError **パラメータを持たせることは悪い習慣ですか?

- (id) initWithArgs:(NSString*) args andError:(NSError**)error; 

多くのおかげで、 ニック

答えて

7

それは珍しいですが、私はそれが必ずしも悪い習慣だとは思わない:私のメソッドの宣言は次のようになります。私は、メソッドの2番目の部分を "andError:"の代わりに "error"という名前にします。メソッド名の部分を 'と'で接続する必要はなく、この場合は、エラーがオブジェクトの初期化に使用されているという印象も与えます。ただ、それを作る:

- (id) initWithArgs:(NSString*) args error:(NSError**)error; 

また、あなたは(nilのような)何か他のものを返却する場合、割り当てられたオブジェクトを解放することを忘れないでください:私が推薦する

- (id) initWithArgs:(NSString*) args error:(NSError**)error 
{ 
    if ((self = [super init])) { 
     if (canInitThisObject) { 
      // init this object 
     } 
     else { 
      [self release]; 
      self = nil; 
      if (error != nil) { 
       *error = [NSError errorWithDomain:someDomain code:someCode: userInfo:nil]; 
      } 
     } 
    } 
    return self; 
} 
+1

ことの一つは、常にエラーを設定していますメソッドの先頭にはnilはありません。発信者がそれをゼロにしたという保証はありません。 – EricS

+4

@EricSエラーがない限り、 'error'を' nil'に設定する理由はありません。メソッドが 'nil'を返さない限り、呼び出し側は' @ error'の値を見てはいけません。それ以外の場合はバグです。 @Calebは 'error'に代入する前に' error'がNULLでないことを確認する必要があります。 – bbum

+0

@bbumありがとうございました。 – Caleb