我刚刚安装了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];
答案 0 :(得分:3)
警告来自您通过访问者在属性上调用release
:执行[self.myViewControllerObject release]
时,实际上您正在调用访问方法myViewControllerObject
,然后调用release
回报价值。由于该方法的名称不是以new
,copy
或mutableCopy
开头,因此您不拥有它返回的对象,因此您不是“允许“到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 版本中尝试它时,我没有发现分析器警告。我感谢所有参与帮助我的人。感谢你的时间。