2

昔ながらの c-array に保存した Objective-C オブジェクトを解放する方法がわかりません。

(注:これを書いているときに、多くの検索を行った後、テストコードにバグを見つけたと思うので、これは質問ではなく解決策のようです。まあ、私はそれに多くの時間を費やしたので投稿しますとにかく…)

古いコードを ARC に変換したいのは、メモリ管理関連のバグのデバッグに多くの時間を費やしているためです (申し訳ありませんが、保持/解放ルールは単に私の背骨に組み込まれておらず、文字通り何時間もかかります)おそらくメモリのクリーンアップ中または後に、無関係な瞬間にエラーがポップアップするため、失われた保持を見つけるため)。

したがって、C スタイルの配列 ( の 2 次元配列など) を使用した既存のコードがいくつかあります。ここでは、ポインターをUILabel*喜んで使用して、 some を介してそれらにアクセスできます。s がランダムな順序で満たされていると仮定しましょう。そのため、 an は使用できません。calloc()array[col*colstride+row*rowstride]arrayUILabel **UILabel*NSMutableArray

現在、ARC では、コンパイラーは の型を にするように求めてarrayいるUILabel *__strong*ようです (一部の人はそれを と書いています__strong UILabel **)。

私が理解していないのは、オブジェクトを解放するUILabelときにARCにオブジェクトを解放するように指示する方法です(たとえばdealloc()、c-arrayを使用するオブジェクトで)。問題を理解しようとして、オブジェクトの小さなセットがありMemoryMemoryUnit前者は後者の大きな c-array を格納しようとしています。

-(Memory*)init {
  self = [super init];
  if (self) {
    MemoryUnit * unit = [[MemoryUnit alloc] init];
    array = (__strong id *) calloc(sizeof(MemoryUnit*), 1024);
    array[0] = unit;
  }
  return self;
}

-(void)dealloc {
  for (int i=0; i<1024; i++) array[i]=nil;
  free(array);
}

MemoryUnitc-array に格納するオブジェクトがあります (これは上記MemoryUnitの場所にあります)。UILabelテストのために、私はコードを持っていました

-(void)dealloc {
  NSLog(@"removed %x", (int)self);
}

dealloc()デバッグ用です。

4

1 に答える 1

0

Bryan が言ったように、スタック オーバーフロー システムで答えが必要です。私もです:

解決

どうやら、type の配列要素を に設定するMemoryUnit *__strongと、この要素がステートメントのペアで宣言されnilているかのように、オブジェクトが解放されます。これは、ARC下のObjective-CオブジェクトへのポインターのCスタイル配列で実際に提案されていると思います@propetty@synthesize

(XCode のドキュメントは非常に簡潔であり、ARC コンパイラの定義は、正しく行う方法についてのヒントを提供するのではなく、許可されていないことだけを教えてくれました。)

于 2013-01-25T09:23:36.907 に答える