Iphone 安全释放UINavigationController?

Iphone 安全释放UINavigationController?,iphone,objective-c,uinavigationcontroller,uipopovercontroller,Iphone,Objective C,Uinavigationcontroller,Uipopovercontroller,我正在为popover创建(UIPopoverController)popover控制器和(UINavigationController)导航控制器,这两个控制器都在头文件中声明。然后,在创建它们时: myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundl

我正在为popover创建(UIPopoverController)popover控制器和(UINavigationController)导航控制器,这两个控制器都在头文件中声明。然后,在创建它们时:

myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]];

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController];

在这一点上,,释放myNavController是否安全?

如果该类不再引用它,则可以在初始化popover控制器后释放导航控制器。

如果该类不再引用它,则可以在初始化popover控制器后释放导航控制器。

如果
myNavController
是一个实例变量,那么在您的
dealloc
方法之前,您不应该释放它。如果它只是一个局部变量,您应该在该方法中最后一次引用它之后释放它。

如果
myNavController
是一个实例变量,那么您不应该在
dealoc
方法之前释放它。如果它只是一个局部变量,您应该在该方法中最后一次引用它之后释放它。

只要考虑一下约定,它简单地说,如果您分配了一个对象,您就是它的所有者

换句话说,只要您不需要,您就有权立即发布
myNavController

另一方面,
UIPopoverController
应使用retain接管
myNavController

所以,(再次)是的。您可以安全地释放
myNavController

所有权公约规则不受尊重的情况非常罕见。这些类型的异常在特定方法的文档中提到。但事实并非如此

让我们为您的代码段应用以下规则: 在第一行

  myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]];
myNavController的保留计数至少为
1

第二行

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController];
将导致
myNavController
的保留计数至少为2,通过
initWithContentViewController

中的所有权,只需考虑一下简单的约定,即如果您分配了一个对象,您就是它的所有者

换句话说,只要您不需要,您就有权立即发布
myNavController

另一方面,
UIPopoverController
应使用retain接管
myNavController

所以,(再次)是的。您可以安全地释放
myNavController

所有权公约规则不受尊重的情况非常罕见。这些类型的异常在特定方法的文档中提到。但事实并非如此

让我们为您的代码段应用以下规则: 在第一行

  myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]];
myNavController的保留计数至少为
1

第二行

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController];

通过在MyPopOvercontroller类中的
initWithContentViewController

中取得所有权,将导致
myNavController
的保留计数至少为2,我在myNavController上调用pushViewController,在它被创建之后,用户点击显示在popover上的一个项目…那么我不应该在这里释放myNavController吗?在MyPopopOvercontroller类中,创建myNavController后,我在其上调用pushViewController,用户单击弹出窗口上显示的项目…因此,我不应该在此处释放myNavController吗?不要调用
重新计数
。鉴于
UIPopoverController
是UIKit框架中的一个类,任何给定时间的保留计数都完全是一个实现细节。试图将意义赋予绝对值是徒劳的。将保留完全视为所有权和三角洲;如果您不再需要拥有一个对象,可以释放它。@bbum:
UIPopoverController
继承自
NSObject
,因此可以传递
retainCount
消息。我在这里使用的表达式,如
[x retainCount]
纯粹是说明性的,意思是一个对象至少有这个值。请告诉我我到底要分配什么?您说过“将导致myNavController的保留计数为2”。这是一个错误的假设。通过retainCount并期望给定的绝对值是不正确的。这是关于另一个明智正确答案的坏(不正确)建议OK,用相应的备注更新了答案。我只是尽可能简单地解释了主要思想。不要调用
retainCount
。鉴于
UIPopoverController
是UIKit框架中的一个类,任何给定时间的保留计数都完全是一个实现细节。试图将意义赋予绝对值是徒劳的。将保留完全视为所有权和三角洲;如果您不再需要拥有一个对象,可以释放它。@bbum:
UIPopoverController
继承自
NSObject
,因此可以传递
retainCount
消息。我在这里使用的表达式,如
[x retainCount]
纯粹是说明性的,意思是一个对象至少有这个值。请告诉我我到底要分配什么?您说过“将导致myNavController的保留计数为2”。这是一个错误的假设。通过retainCount并期望给定的绝对值是不正确的。这是关于另一个明智正确答案的坏(不正确)建议OK,用相应的备注更新了答案。我只是尽可能简单地解释了主要思想;如果您有一个保留的引用,则您“拥有”该对象。如果不再需要该引用,则应将其释放。如果它是一个实例变量,并且您在
dealloc
之外执行
release
操作,那么最好将
nil
指定给实例变量,这样您就不会出现悬空指针;如果您有一个保留的引用,则您“拥有”该对象。如果不再需要该引用,则应将其释放。如果是实例v