2012-08-22 14 views
0

在我的比赛,我以编程方式分配一些UIImageViews的用下面的代码:的界面元素设置为nil仍然存在于应用程序

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"); 
} 

他们仍然留在屏幕上。他们不与任何东西互动,但仍然保持在屏幕上。为什么是这样的,我该如何摆脱这些物体?

+1

不是你的问题的答案,但你可能想阅读关于[IBOutletCollection](http://www.bobmccune.com/2011/01/31/using-ios-4s-iboutletcollection/) –

+0

我不喜欢使用IBOutletCollection,以便我仍然可以支持iOS 3. – Greg

+1

您可能不需要支持iOS 3,它不再被广泛使用,最新的开发人员工具甚至不支持定位低版本的iOS版本。如果您像问题所示使用ARC,那么您的应用程序无论如何都不会在iOS 3上运行。 – Jim

回答

2

你的UIImageViews仍然被viewController的视图所保留。尝试使用:

for (int i = 1; i<= 4; i++) { 
    [blocks[i] removeFromSuperview]; 
    blocks[i] = nil; 
} 
1

的方法addSubview:文件说:

The view to be added. This view is retained by the receiver. After being added, this view appears on top of any other subviews.

制作,直到它被删除从它的上海华指针为零不会释放视图。

1

addSubview文档:

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

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

[view removeFromSuperview]; 
    view = nil; 
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 
} 
0

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

相关问题