2
-(NSData *)jsonRepresentation:(NSError **error)error {
   NSDictionary *dict = [self getDictRepresentation];
   return [NSJSONSerialization dataWithJSONObject:dict options:nil error:error];
}

// Some other place...

NSError *__autoreleasing error = nil;
NSData *json = [obj jsonRepresentation:&error];

自動解放セマンティクスerrorは、スタックを2番目のコードブロックに安全に伝達しますか?

4

2 に答える 2

5

clang ARC 仕様に従って、形式のメソッド引数NSError **(または、任意の obj-c オブジェクトへのポインター) は暗黙的に であると見なされますNSError * __autoreleasing *。これは、エラーがメソッドで自動解放されることを意味します。

呼び出しサイトについては、__autoreleasing変数を使用して呼び出すと、すべて問題ありません。実際、私はこのパターンをお勧めします。__strongただし、代わりに変数を使用して呼び出すと、引き続き機能します。その場合、コンパイラは名前のない__autoreleasing一時ファイルを生成し、そのアドレスをメソッドに渡します。その後、戻り時に、一時ファイルを に割り当て__strongます。だからあなたが持っているなら

NSError *foo;
[bar callMethodWithError:&foo];

コンパイラはこれを次と同じように扱います

NSError *foo;
NSError * __autoreleasing tmp = foo;
[bar callMethodWithError:&tmp];
foo = tmp;

out-param が とマークされている場合、実際にはそれよりも少し複雑になりoutますが、これは一般的にどのように機能するかです。

于 2013-03-18T21:22:29.237 に答える
3

はい、正しいですが、変数の宣言ではなく、メソッドの宣言でこの修飾子を指定する必要があります。Apple の公式ドキュメントでさえ、まさにこの状況について明示的に言及しています。

__autoreleasingid *は、参照 ( ) によって渡され、戻り時に自動解放される引数を示すために使用されます。

于 2013-03-18T21:20:00.737 に答える