【发布时间】:2012-07-24 10:45:21
【问题描述】:
我的类头文件中有一个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 而不会遇到这样的崩溃!
【问题讨论】:
-
标签在
dealloc被调用之前已经被释放。那是因为它是一个自动释放对象。您的dealloc正在尝试发布一个已经发布的 uilabel,它的崩溃.. 在您的问题中。您可以使用 1 或 2。 -
但它已经保留在.h头文件的@property行中......
-
如果我使用上述3点之一,应用程序肯定会泄漏内存
-
分配会增加它的保留计数,然后当它被自动释放时它的减少,然后你释放一个dealloc'd对象。正如janusfidel所说。不需要把它作为一个属性,它是一个自动释放视图对象,只需要一个指针
-
您只分配了一次标签,即在您的 viewDidLoad 中,@property(retain) 不会分配任何东西,但会告诉编译器我们希望如何处理我们的属性。
标签: iphone objective-c ios cocoa-touch