0

私のゲームでは、次のコードを使用していくつかの UIImageView をプログラムで割り当てます。

blocks[1] = [[UIImageView alloc] initWithFrame: CGRectMake(200, y1, kBlockHeight, kBlockHeight)];
blocks[2] = [[UIImageView alloc] initWithFrame: CGRectMake(320, y2, kBlockHeight, kBlockHeight)];
blocks[3] = [[UIImageView alloc] initWithFrame: CGRectMake(440, y3, kBlockHeight, kBlockHeight)];
blocks[4] = [[UIImageView alloc] initWithFrame: CGRectMake(560, y4, kBlockHeight, kBlockHeight)];

blocks[1].backgroundColor = [UIColor blackColor];
blocks[2].backgroundColor = [UIColor blackColor];
blocks[3].backgroundColor = [UIColor blackColor];
blocks[4].backgroundColor = [UIColor blackColor];

[self.view addSubview: blocks[1]];
[self.view addSubview: blocks[2]];
[self.view addSubview: blocks[3]];
[self.view addSubview: blocks[4]];

正常に動作しますが、オブジェクトを削除して再起動しようとすると、

for (int i = 1; i<= 4; i++) {
    blocks[i] = nil;
    //ARC won't let me call [blocks[i] release];
    NSLog(@"releasing blocks");
}

彼らはまだ画面にとどまります。それらは何とも対話しませんが、画面上に描画されたままです。これはなぜですか? オブジェクトを取り除くにはどうすればよいですか?

4

5 に答える 5

2

UIImageViews は、viewController のビューによって引き続き保持されます。使用してみてください:

for (int i = 1; i<= 4; i++) {
    [blocks[i] removeFromSuperview];
    blocks[i] = nil;
}
于 2012-08-22T14:42:51.190 に答える
2

これを試して、

for (int i = 1; i<= 4; i++) {
    [blocks[i] removeFromSuperview];
    blocks[i] = nil; //removing from parent will not release so then you have to assign nil
}
于 2012-08-22T14:43:19.820 に答える
1

メソッドのaddSubview:ドキュメントには次のように書かれています。

追加するビュー。このビューは受信者によって保持されます。追加後、このビューは他のサブビューの上に表示されます。

ポインターを nil にすると、スーパービューから削除されるまでビューは解放されません。

于 2012-08-22T14:43:04.833 に答える
1

のドキュメントからaddSubview:

  This method retains view and sets its next responder to the receiver, which is its new superview.

つまり、親ビューにはまだポインターがあります。元のポインターを nil してもかまいません。ビューを削除したい場合は、

  [view removeFromSuperview];
  view = nil;
于 2012-08-22T14:43:06.363 に答える