3

これは非常に基本的な質問に思えるかもしれませんが、基本的な質問を説明(および理解)することが、クリーンで機能するコードを構築するための鍵であると常に考えていました。CoreDataエンティティに次のコードフラグメントがあります。

-(BOOL)validateForInsert:(NSError *__autoreleasing *)error {
    [super validateForInsert:error];
    return [self validateInternal:error];
}

-(BOOL)validateInternal:(NSError *__autoreleasing *)error {
  // checking attributes and build userInfo error
  if(anyErrors) {
    *error = [NSError errorWithDomain:appDomain code:200 userInfo:details];
    return NO;
  }
  return YES;
}

Xcodeで「analyze」を実行すると、エラーの作成時に有名な「潜在的なnull逆参照」が発生します。コンパイラがアラートを出していない間、コードは常に機能しています。これも質問になる可能性がありますが、なぜコンパイラがそれについて警告しないのですか?

しかし、コードに来ると、(エラー!= nil)かどうかをチェックするという解決策を完全に知っていますが、これにはかなり迷っています。質問は最初から始まり、NSError * _autoreleasing *の意味で、なぜ周囲の星ですか?どちらがポインタへのポインタである必要がありますか?

validateForInsertを呼び出したいと仮定します。自分で*_autoreleasing*オブジェクトを作成するにはどうすればよいですか?

次の質問は、上記の質問に関連していると思います。*エラーを最初から作成している場合、なぜ最初にnilかどうかを確認する必要があるのでしょうか。

最後になりましたが、コードは正常に機能し、エラーが傍受されます。失敗またはクラッシュする可能性のあるケースを見つけてください。CoreDataを使用していると言ったように、一般的な例で十分ですが、CoreDataに関連する別の例をいただければ幸いです。

ありがとう

4

1 に答える 1

3
*error = [NSError errorWithDomain:appDomain code:200 userInfo:details];

構文的に正しいため、コンパイラは警告しません。アナライザーは、これが実行時にクラッシュすることを検出しerror = NULLます。

[myObj validateForInsert:NULL];

あなたが電話する場合

NSError *error;
[myObj validateForInsert:&error];

次に、のアドレスを渡します。errorしたがって、タイプの変数を渡しますNSError * *

修飾子は、割り当てられたオブジェクトが自動解放__autoreleasingされたオブジェクトであるというARCコンパイラへのヒントです。error

自動リリースする変数を宣言できます

NSError * __autoreleasing error;
[myObj validateForInsert:&error];

しかし、通常は気にしません。ARCは正しいコードを生成するだけです。

詳細については、ARCリリースノートへの移行をお読みください。stackoverflowに関するこのトピックについても多くの回答があります。

于 2012-08-08T10:06:02.840 に答える