我如何正确地丢弃子视图?

时间:2011-05-23 18:49:51

标签: iphone objective-c

我的应用程序存在问题,其中的代码太长而无法进入,但足以说明我何时删除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返回一个Icon,就像它应该的那样。

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

4 个答案:

答案 0 :(得分:1)

  

“有没有办法彻底删除   图标,或者目前是removeFromSuperview   我可以去“

您可以将对象设置为nil:

icon = nil;

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这是猜测,但请尝试将self.tag设置为-1或其他一些不会与您在Icon对象上设置的标记发生冲突的值。 viewWithTag:方法会在当前视图及其子视图中搜索匹配项,因此,如果self.tag == 0并且您致电[self viewWithTag:0],则会获得self

答案 3 :(得分:0)

你之前在某处保留了图标吗?如果没有,则在调用removeFromSuperview后无需释放它。同样,除非你需要在其他地方引用icon2,否则你可以在调用addSubview之后释放它。

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