在dealloc中发布UILabel会在应用程序被保留,分配和放置后崩溃。自动释放

时间:2012-07-24 10:45:21

标签: iphone objective-c ios cocoa-touch

我的类头文件中有UILabel定义为:

 `@property (nonatomic, retain) UILabel *label1;` 

它作为实例变量存在,如下所示:

 `UILabel *label1;` 

并在.m文件中合成,然而,在viewDidLoad方法中我做了:

 `label1 = [UILabel alloc] init] autorelease];`

然后我在标签上做了各种各样的事情,比如设置框架,文字颜色等...... 取消分配视图控制器时,应用程序在控制台

中与此消息崩溃
 (Zombies enabled): `[CALayer release] message sent to deallocated instance` ...

当我:

时,应用程序不会崩溃

1)删除autorelease字..或

2)如果我没有在dealloc方法中释放label1 ..或

3)删除[super dealloc];来自视图控制器的dealloc方法。

如何在不面临此类崩溃的情况下正确发布此UILabel

5 个答案:

答案 0 :(得分:2)

你做得对.Autorelease并释放dealloc。 但它不应该崩溃。因为我做了同样的事情来检查。 你可以检查一下accciendlty可能是你在其他地方发布标签。 并再次发布dealloc。

答案 1 :(得分:1)

因为您已将标签声明为保留。分配可以是

UILabel *myLabel = [[UILabel alloc] init];
// set all properties of label
self.label1 = myLabel;
[myLabel release];
myLabel = nil;

在dealloc中释放你的label1。

[label1 release];

这是我习惯的方式,这让我的事情变得更顺畅。

答案 2 :(得分:0)

这样做,你不会对label1使用autorelease:

 - (void)dealloc
{
  if(label1)
  {
    label1 = nil;
    [label1 release];
  }
  [super dealloc];
}

答案 3 :(得分:0)

标签在调用dealloc之前就已经发布了。那是因为它是一个自动释放对象。你的dealloc试图释放已经发布的UIlabel,它会在你的问题中崩溃。你可以使用1或2.如果你分配了一次对象,那么只需调用一次。这不是因为你在retain指令中将@property分配给你的属性会为你的对象添加1个保留计数,@property(retain)将不会分配任何东西,但会告诉编译器你希望如何处理你的属性

答案 4 :(得分:0)

奇怪的是,当我使用self.label1 = [[[UILabel alloc] init] autorelease];而不是label1 = [[[UILabel alloc] init] autorelease];解决了这个问题。 dealloc方法保持不变,没有任何变化。真奇怪!!