0

在我的游戏中,我使用以下代码以编程方式分配了一些 UIImageViews:

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.

即,父视图仍然有一个指针。没关系,您将原始指针归零。如果你想摆脱一个视图,使用

  [view removeFromSuperview];
  view = nil;
于 2012-08-22T14:43:06.363 回答
0

您混淆了两件不同的事情 - 内存分配和视图层次结构的组成。您需要通过向它们发送removeFromSuperview消息来从视图层次结构中删除这些视图。如果您的应用程序没有其他部分拥有它们,那么这些对象将被释放,但不要将此释放与视图层次结构的修改混淆,这是非常不同的。

于 2012-08-22T14:54:24.813 回答