41

__autoreleasing次のサンプル コード ブロックの目的を説明してもらえますか?

- (void)execute:(NSError * __autoreleasing *)error {
    // do stuff, possibly assigning error if something went wrong
}

を削除しましたが__autoreleasing、すべてが正常にコンパイル/実行されているようです。私は ARC の後に obj-c を使い始めたので、これらすべての二重アンダースコアのことを実際に学んだり理解したりすることはありませんでした。ARC移行ガイドを読みましたが、NSErrorの例を完全には理解していません.

4

1 に答える 1

85

ARC が変数をどのように扱うかを検討してください各参照変数にはモード (暗黙的または明示的) があります: strongweakなど。このモードにより、ARC はその変数への読み取りと書き込みを処理する方法を知ることができます。たとえば、強力な変数の場合、読み取りには追加のアクションは必要ありませんが、書き込みには、変数内の既存の参照を新しいものに置き換える前に解放する必要があります。ARC が機能するには、変数のモードを知る必要があります。

ここで、それ自体が参照によって渡される変数を検討してください。たとえば、execute次の行に沿って呼び出しを行います。

NSError *myError = nil;
...
[someObject execute:&myError]; // pass the variable itself by reference, not the variables value

の本文にexecuteは、次の行に沿った割り当てが含まれます。

- (void)execute:(NSError * __autoreleasing *)error
{
   ...
   if (error != NULL)
      *error = [NSError ...]; // assign indirectly via the reference to a variable
   ...
}

その間接代入のために、ARC は参照される変数のモードを知る必要があるため、読み書きの方法を知ることができます。それが__autoreleasing宣言の内容であり、モードがautoreleasesである変数への参照が渡されたことを ARC に伝え、変数の内容を読み書きする方法を ARC に伝えます。を削除する__autoreleasingと、デフォルトのモードが想定されます。この場合、明示的であることが確かに良いことをお勧めします。

自動解放モードは、変数に所有されていない参照が含まれていることを意味し、読み取りは必要に応じて保持する必要があり、書き込みは書き込みのみが可能です。これは主に、参照によって渡される変数に使用されます。

myError上記の例では、変数のモードがストロング(暗黙的) であるにもかかわらず、参照によって自動解放として渡されていることに気付くかもしれません。コンパイラは、一時的な自動解放変数を導入し、現在の参照を保持せずmyErrorにコピーして渡すことで、これを自動的に処理します。への引数としての一時的な参照execute:。呼び出しが返された後、コンパイラは一時的な から への通常の割り当てを行いmyErrorます。これにより、古い参照が解放され、返された参照が保持されます。

詳細については、Apple の ARC リリース ノートへの移行を参照してください。

コメントへのフォローアップ

Q:__autoreleasing暗黙的に設定されていますか?

A: Apple のドキュメントは具体的ではありませんが、Clang のドキュメントでは、間接パラメータに対して暗黙的であると述べています。上記のように、明確にすることをお勧めします。明確であることは Good Thing™ です。

Q:配置は関係ありますか?

A: はい、いいえ... これは C の宣言であり、クイズの質問 (「次の宣言は...」) の内容です。修飾子は、オブジェクトへの (型の変数) 自動解放ポインターへのポインターであるため、2 つのアスタリスクの間にある必要がありますが、Apple は、コンパイラーが何を許すかを特定せずに「寛容」であると述べています。安全にプレイし、適切な場所に置いてください。

Q:間接課題を行う前に、適性error検査をすべきではありませんか?NULL

A: もちろん、間接化を行う前のどこかで行う必要があります。示されているコードは単なる概要であり、そのような詳細は省略され、 で覆われてい...ます。しかし、何年にもわたって何度か値上げされてきたので、省略しすぎたのかもしれません。適切なものifが追加されました。

于 2012-11-27T18:29:14.953 に答える