3

私の現在の理解から、「参照渡し」の推奨される方法(ARCが有効になっている場合)は次のようになります。

-(void)somefunc:(someclass **)byref; 
// and 'someclass **' should be inferred to 'someclass * __autoreleasing *'
// am i right?

//or we could just explicitly define it like 
-(void)somefunc:(someclass * __autoreleasing *)byref;

ただし、このスレッドへの回答から、ARC での Pointer-to-Pointer Ownership Issues の処理

-(void)somefunc:(someclass *__strong *)byref も同様にトリックを実行できるようです(上記のリンクのdemo2で)。

1.-(void)somefunc:(someclass * __autoreleasing *)byref;
2.-(void)somefunc:(someclass *__strong *)byref

最初のものについては、Apple によって文書化されているように、コンパイラによって次のように暗黙的に書き換えられる必要があります。

NSError * __strong error;
NSError * __autoreleasing tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;

2番目の方がパフォーマンスが良いようですか?「値の代入」と「自動解放」のプロセスを省略しているためです。しかし、このように宣言された関数はめったに見ません。2番目の関数を使用して「参照渡し」ジョブを実行する方が良い方法ですか?

提案や説明はありますか?前もって感謝します。

4

1 に答える 1

-1

2番目の関数はスレッドセーフ/「遅延セーフ」ではありません。最初のものはより正しいです。

ブロックがパラメーターをキャプチャし、performSelector がオブジェクトを保持する理由と同じ理由です。


呼び出し元 fA が A への強力な参照を割り当ててから、ASYNC 関数 fB を呼び出すとします。fA は完了していますが、fB はまだ呼び出されていません。

于 2013-03-27T15:42:33.400 に答える