0

アプリがありnon-gc OS Xます。このアプリでは、ブロック内からブロック変数にオブジェクトを代入しようとしています。このオブジェクトは、別のスレッドによって配列からクリーンアップされています。構造体がフラグを設定していて、dispose ヘルパー関数がオブジェクトをクリーンアップしているのはnon-gcアプリだからだと思います。コピーは十分に安全な修正ですか?block_byrefBLOCK_NEEDS_FREE

- (void)assignFromArray
{
  __block NSObject iWantToKeep = nil;

  [myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
  {
    if([[obj stringVar] isEqualToString:MyStringConst])
    {
       iWantToKeep = [obj copy];
       *stop = YES;
    }
  }];

/* Assume here that the array has been cleaned up by another thread
 * and all the objects in it have been released.
 *
 * Was a copy safe enough to survive the block_byref dispose
 * and the array objects being dealloc'd so that it can be accessed here?
 */
   NSLog(@"%@", [iWantToKeep stringVar]);

  //I only need it briefly, so it can be cleaned up here
  [iWantToKeep autorelease];
}
4

2 に答える 2

3

はい、それは完全に機能します。配列が破棄される前にコピーが作成されていることを確認する必要があります。

于 2012-12-17T09:38:02.713 に答える
2

iWantToKeep新しい値を割り当てる前に解放する必要があります。そうしないと、リークが発生します。

copyなぜオブジェクトを使用しているのかわかりません。コピーの動作が必要だと思います。オブジェクトを保持する必要があります(をcopy実行しますretain)。

block_byrefの破棄に耐えるのに十分安全なコピーでした

このiWantToKeep時点では、変数はまだスコープ内にあります。なので使えます。

ここでアクセスできるように配列オブジェクトの割り当てが解除されていますか?

配列はその要素を「割り当て解除」しません。それらを解放します。必要なオブジェクトを保持しているので、所有して使用できます。

ここで、配列が別のスレッドによってクリーンアップされ、その中のすべてのオブジェクトが解放されたと想定します。

それは安全ではないようです。これが少し前の反復で発生し、反復中に配列が変更または割り当て解除されると、悪いことが起こります。

于 2012-12-17T19:51:06.267 に答える