分析器警告有关引用计数的错误减少

时间:2011-11-10 15:03:55

标签: objective-c ios static-analysis xcode4.2

我刚刚安装了Xcode 4并打开了我的应用程序的早期版本。分析仪报告此行:

[self.myViewControllerObject release];
  

调用者不在此时拥有的对象的引用计数的不正确的减少

我没有为我的项目启用ARC。

当我在Xcode 3.2.5中分析我的应用程序的v2.0时,它没有显示任何潜在的错误。

部首:

        @class MyViewController;

        MyViewController *myViewControllerObject;

        @property ( nonatomic , retain )  MyViewController *myViewControllerObject; 

实现:

        #import "MyViewController.h"

        @synthesize myViewControllerObject;

点击按钮后,我有:

尝试1:

self.myViewControllerObject = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 

[self.navigationController pushViewController:self.myViewControllerObject animated:YES];


[self.myViewControllerObject release];

尝试2:

MyViewController *temp = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];  

self.myViewControllerObject = temp;

[temp release];

[self.navigationController pushViewController:self.myViewControllerObject animated:YES];


[self.myViewControllerObject release];

尝试3:

self.myViewControllerObject = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 

[self.navigationController pushViewController:self.myViewControllerObject animated:YES];

dealloc方法中,我将其发布:

[self.myViewControllerObject release];

3 个答案:

答案 0 :(得分:3)

警告来自您通过访问者在属性上调用release:执行[self.myViewControllerObject release]时,实际上您正在调用访问方法myViewControllerObject,然后调用release回报价值。由于该方法的名称不是以newcopymutableCopy开头,因此您不拥有它返回的对象,因此您不是“允许“到release

解决方案是永远不要在该访问者的返回值上调用release,所以基本上你的尝试#2很好:

MyViewController *temp = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];  
self.myViewControllerObject = temp;
[self.navigationController pushViewController:temp animated:YES];
[temp release];

但是在dealloc中不要使用访问者,而是使用

[myViewControllerObject release];

如果您需要release 以外的myViewController dealloc ,请通过设置者指定nil

self.myViewControllerObject = nil;

修改:有关此主题的更多信息,请参阅Apple's Advanced Memory Management Guide

答案 1 :(得分:0)

导航控制器管理您添加到其中的视图控制器的生命周期。这样,当您按下视图控制器时,您将传递“所有权”。但是,没有理由不能保持对视图控制器的引用。试试这个订单:

    self.myViewControllerObject = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 

    [self.myViewControllerObject release];

    [self.navigationController pushViewController:self.myViewControllerObject animated:YES];

Alloc'd对象的保留计数为1。为“retain”属性赋值会使保留计数增加1。您应该只为该对象保留一个保留,以便正确释放。但是,由于你从两个开始,在将它传递给导航控制器之前释放它是很好的。您看到的编译器警告只是 - 警告,并不总是证明您正在做严格错误的事情。如果你通过它然后释放应该没关系,但上面的顺序应该避免它。

答案 2 :(得分:0)

当我使用 XCode 4 Beta 版本时,问题就出现了。但是当我在 XCode 4 版本中尝试它时,我没有发现分析器警告。我感谢所有参与帮助我的人。感谢你的时间。