安全发布UINavigationController?

时间:2011-01-21 16:33:04

标签: iphone objective-c uinavigationcontroller uipopovercontroller

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

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

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

此时,释放myNavController是否安全?

3 个答案:

答案 0 :(得分:2)

如果此类不打算再次引用它,您可以在初始化弹出控制器后释放导航控制器。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

只要想一下Object Ownership and Disposal惯例,简要说明如果你已经分配了一个对象,那么你就是它的拥有者。

换句话说,一旦您不需要,您就有权发布myNavController

另一方面,UIPopoverController应使用保留对myNavController拥有所有权。

所以,(再次)是的。您可以放心地发布myNavController

在一些罕见的情况下,所有权惯例规则不受尊重。特定方法的文档中提到了这些异常。但事实并非如此。

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

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

myNavController的保留计数至少 1。

第二行

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController];
通过myNavController内的所有权,

将导致initWithContentViewController的保留计数至少 2。