2011-05-23 70 views
0

我有我的应用程序有问题,其中对于该代码是太长了进入,但我只想当我取出一个UIView,并用一个新的像这样替换它说:我如何正确丢弃子视图?

NSLog(@" .. %@", (Icon *)[self viewWithTag:index]); 
Icon *icon = (Icon *)[self viewWithTag:index]; 
CGRect frame = icon.frame; 
int tag = icon.tag; 
[icon removeFromSuperview]; 
[icon release]; 

Icon *icon2 = [[Icon alloc] init]; 
icon2.frame = frame; 
[icon2 makeIconStandardWithTag:(int)tag]; 
[self addSubview:icon2]; 

它做了一些奇怪的事情,第一次NSLog(因为视图已经存在)显示该对象是一个图标,但运行此代码后第二次显示它是一个UIImageView出于某种原因,现在它显示了我假定是屏幕上某个奇怪位置的原始图标。这是非常不稳定的行为。但我知道的是这样的:

删除[icon removeFromSuperview];行,尽管保持对象在那里,停止这种行为,并导致NSLog返回一个图标,因为它应该。

所以我的猜测是它不能正确删除图标。有没有办法完全删除图标,或者是我可以去的removeFromSuperview。我能做的只是将它设置为alpha = 0,但这更多的是修补解决方案,而不是我想如何解决它。

回答

1

“有没有办法彻底清除 图标,或者是removeFromSuperview据 我可以去”

您可以将对象设置为nil:

icon = nil; 
+0

谢谢。虽然这还没有解决我的问题(这个问题与将它从超级视图中移除有关),这使我向前迈进了一步。 – Andrew 2011-05-23 18:59:58

+1

这只是防止你无意中发送消息给非零但释放的对象。这在Garbage Collected环境中很有用,但不会在iOS上更快地发布该对象。 – Abizern 2011-05-23 19:00:21

1

灿你在这行代码中验证“self”是什么: 它可能不是你的想法。

[self addSubview:icon2]; 
    NSLog(@" Self is %@", self); 
+0

自我就是它的意图。 (还是)感谢你的建议。 – Andrew 2011-05-23 19:09:27

0

这是一个猜测,但尝试设置self.tag为-1或不与你在你的Icon对象设置标签碰撞的其他值。 viewWithTag:方法搜索当前视图及其子视图以进行匹配,因此如果self.tag == 0和您调用[self viewWithTag:0],则会得到self

+0

试过这个。还给每个子视图一个-1的标签,否则我敢肯定他们中的一个看起来是第一次使用viewwithtag。虽然也许第一个带0的视图是我的第一个图标,但因为第二个图标是新的,所以其他东西等于0.很遗憾,我无法得到一切为0的列表,我想我已经做了所有其他的事情a -1。 – Andrew 2011-05-23 19:37:58

0

在此之前你在某处保留过图标吗?如果没有,在调用removeFromSuperview之后不需要释放它。同样,除非你需要在别处引用icon2,否则可以在调用addSubview之后释放它。

视图保留通过addSubview添加的视图,它们释放通过removeFromSuperview删除的视图。