0

私が持っている:

id<EnemyUpdate> enemies[6][10];

そして、次を使用してカスタム クラスを初期化します。

// init
enemies[row][col] = [[MyenemyClass alloc]init];
//..

-(void) dealloc{
     [super dealloc]
      // I want to release the 2d array here
}

では、後で (dealloc メソッドで) 2 次元配列でオブジェクトを解放するにはどうすればよいでしょうか? free(enemies[row][col]) を呼び出しても、クラスの dealloc メソッドには入りません。ちなみに、自動解放は使いたくありません。どうすればいいですか?

4

2 に答える 2

1

それらをループして、1 つずつ解放する必要があります。

for (int i = 0; i < 6; ++i)
  for (int j = 0; j < 10; ++j)
    [enemies[i][j] release];

free(enemies);

この状況では使用してはならないことに注意してくださいautorelease: オブジェクトは管理されていないオブジェクト (C 配列) に格納されているため、オブジェクトを保持する人が他にいないため、自動解放によってゾンビ オブジェクトが発生します。私が言いたいのは、あなたにはできないということです

[[[MyenemyClass alloc]init] autorelease]

に項目を追加するときに通常行うようNSMutableArrayに、C 配列に管理対象オブジェクトを設定するときに保持カウントが増加しないため、オブジェクトは解放されますが、配列内のポインターはガベージを指し続け、しようとするとほとんどがクラッシュします。これを使って。

ARC 環境で作業している場合、これは機能しないことに注意してください。

于 2012-04-22T21:52:30.560 に答える
1

他の objc 変数と同様releaseに、配列の各要素を処理します。また、 を呼び出すenemies[][] 前にを解放する必要があります[super dealloc]

実装は次の形式になります。

- (void)dealloc
{
  for (size_t i = 0; i < 6; ++i) {
    for (size_t j = 0; j < 10; ++j) {
      [enemies[i][j] release];
      enemies[i][j] = nil;
    }
  }

  [super dealloc]
}

編集

メソッド -release が見つからないという警告が表示されますか?

これreleaseは、 がEnemyUpdateプロトコルになく、タイプがであるためですid<EnemyUpdate>。配列を次のように宣言できますNSObject<EnemyUpdate>* enemies[6][10];

また

EnemyUpdateを採用することを指定します@protocol NSObject:

@protocol EnemyUpdate < NSObject >
...
@end
于 2012-04-22T22:08:50.333 に答える