我的类头文件中有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
!
答案 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方法保持不变,没有任何变化。真奇怪!!