0

I have a UILabel in my class header file defined as :

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

and it exists as instance variable like this:

 `UILabel *label1;` 

and synthesized in the .m file, however, in viewDidLoad method I do:

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

then I do various things on the label like setting its frame, text color, etc ... when the view controller is deallocated, the app crashes with this message in console

 (Zombies enabled): `[CALayer release] message sent to deallocated instance` ...

The app will not crash when I :

1) remove the autorelease word .. or

2) if i do not release label1 in the dealloc method .. or

3) remove [super dealloc]; from the dealloc method of the view controller.

how can I properly release this UILabel without facing such crash !!

4

5 回答 5

2

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

于 2012-07-24T11:31:14.937 回答
1

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

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

并在 dealloc 中释放您的 label1。

[label1 release];

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

于 2012-07-24T15:46:08.243 回答
0

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

于 2012-07-24T11:57:06.447 回答
0

这样做,您将不会对 label1 使用自动释放:

 - (void)dealloc
{
  if(label1)
  {
    label1 = nil;
    [label1 release];
  }
  [super dealloc];
}
于 2012-07-24T10:56:15.827 回答
0

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

于 2012-07-24T11:21:14.063 回答