1
__block NSString *x = @"123"; //  x lives in block storage
void (^printXAndY)(NSString*) = ^(NSString *y) {
    x = [x stringByAppendingString:y];
    printf("%@ %@\n", x, y);
};
printXAndY(@"456");

アップルのドキュメントには次のように書かれています。

__block ストレージ タイプ __block ストレージ タイプ修飾子を適用することで、インポートされた変数が変更可能 (つまり、読み書き可能) であることを指定できます。

xが変更可能な場合、これはx = [x stringByAppendingString:y];間違っていませんか? メモリリークを引き起こす可能性がありますか?

4

1 に答える 1

3

まず、まったく関係のない 2 つのことを混同しています。1)変数が代入可能 (つまり、非const) であり、2) 変数がオブジェクト ポインター型の場合、それが指すオブジェクトは「変更可能」です。

__blockローカル変数はconstブロック内にあるため、実行できませんx = something。変数を作成すると、ブロック内で__block実行できますx = something(のタイプに関係なくx)。がポインター変数である場合x、それに代入すると、別のものを指すようになります。

「変更可能な」オブジェクトのいわゆる「変更」とは、オブジェクトの「内容」を何らかの形で変更するメソッドを呼び出すことができることを意味します。このオブジェクトを指す可能性のあるポインターへの割り当ては必要ありません。


2 番目の質問、メモリ リークについては、いいえ、メモリ リークがあってはなりません。まず、ARC を使用している場合、リークがないことは明らかです。MRCを使っていても漏れはありません。実際、これが MRC の場合、このコード内のオブジェクト ポインターは関数によって保持されていない ( 、 、 、 などの結果ではないretain)allocためnewcopyリークの可能性はありません。

于 2013-10-02T20:26:05.227 に答える