[objective-c] ARCの下に__autoreleasing所有者修飾子を記述する必要があるのはどのような状況ですか?



Answers

コメントにMacmadeの回答とProud Memberのフォローアップの質問をフォローアップしました(これはコメントとして投稿しましたが、最大文字数を超えています)。

__autoreleasingの変数修飾子が2つの星の間に置かれているのはこのためです。

はじめに、修飾子付きのオブジェクト・ポインタを宣言するための正しい構文は次のとおりです。

NSError * __qualifier someError;

コンパイラはこれを許します:

__qualifier NSError *someError;

それは正しくありません。 Apple ARCの移行ガイドを参照してください (「変数を正しく装飾する必要があります...」を参照)。

メモリアドレスを指すポインタはプリミティブ型へのポインタであり、オブジェクトへのポインタではないため、ダブルポインタはARCメモリ管理修飾子を持つことができません。 ただし、ダブルポインタを宣言すると、ARCは2番目のポインタのメモリ管理ルールを知りたいとします。 そのため、ダブルポインタ変数は次のように指定されます。

SomeClass * __qualifier *someVariable;

したがって、double型のNSErrorポインタであるメソッド引数の場合、データ型は次のように宣言されます。

- (BOOL)save:(NSError* __autoreleasing *)errorPointer;

英語で "__autoreleasing NSErrorオブジェクトポインタへのポインタ"と書かれています。

Question

私はパズルを完成しようとしています。

__strongはNSObject、NSStringなどのObjective-Cの保持可能なオブジェクトポインタのデフォルトです。これは強力な参照です。 ARCはスコープの終わりにそれを-releaseします。

__unsafe_unretainedは古い方法と同じです。 保持可能なオブジェクトを保持せずに弱いポインタに使用されます。

__weak__unsafe_unretainedと似ていますが、それは自動ゼロ化弱参照です。つまり、参照オブジェクトの割り当てが解除されるとすぐにポインタがnilに設定されます。 これにより、ポインタとEXC_BAD_ACCESSエラーが発生する危険性が排除されます。

しかし、 __autoreleasingは何のために良いのでしょうか? この修飾子を使用する必要があるときの実用的な例を見つけるのは苦労しています。 私はそれがポインタポインタを期待する関数とメソッドのためだけだと信じています:

- (BOOL)save:(NSError**);

または

NSError *error = nil;
[database save:&error];

ARCの下でこれを宣言する必要があります:

- (BOOL)save:(NSError* __autoreleasing *);

しかし、これはあまりにも漠然としており、 なぜ私は完全に理解したいのですか? 私が見つけたコードスニペットは、奇妙に見える2つの星の中に__autoreleasingを置きます。 型はNSError**NSError**へのポインタポインター)なので、単にNSError**前ではなく、星の間に__autoreleasingなぜですか?

また、私が__autoreleasing依存しなければならない他の状況もあります。




Related