在我的游戏中,我使用以下代码以编程方式分配一些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");
}
他们仍留在屏幕上。他们不与任何东西互动,但仍然留在屏幕上。为什么这样,我该怎么做才能摆脱这些对象?
答案 0 :(得分:2)
您的ViewController视图仍然保留您的UIImageViews。尝试使用:
for (int i = 1; i<= 4; i++) {
[blocks[i] removeFromSuperview];
blocks[i] = nil;
}
答案 1 :(得分: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
}
答案 2 :(得分:1)
方法addSubview:
文档说:
要添加的视图。该视图由接收器保留。添加后,此视图将显示在任何其他子视图之上。
将指针设为nil将不会释放视图,直到将其从超级视图中删除。
答案 3 :(得分:1)
来自addSubview
的文档:
This method retains view and sets its next responder to the receiver, which is its new superview.
即,父视图仍然有一个指针。没关系,你没有原始指针。 如果您想摆脱视图,请使用
[view removeFromSuperview];
view = nil;
答案 4 :(得分:0)
您混淆了两件不同的事情 - 内存分配和视图层次结构的组合。您需要通过向removeFromSuperview
消息发送这些视图,从视图层次结构中删除这些视图。如果您的应用程序没有其他部分拥有它们,那么这些对象将被释放,但不要将此解除分配与视图层次结构的修改混淆,这是非常不同的。