我的uinavigationcontroller将被保留或将被释放

时间:2011-07-31 01:46:14

标签: iphone objective-c

navigationController = [[[UINavigationController alloc] initWithRootViewController:firstMenuView] autorelease];
[view addSubview:navigationController.view];

视图是否在navigtioncontroller上保留?或者我需要保留它吗?

调用navcontroller.view removefromparent实际上是否释放了nav控制器?

3 个答案:

答案 0 :(得分:2)

控制器是视图的owner,视图将向控制器保留弱引用(非retain ed),控制器将保持强大(retain ed )参考视图。在这种情况下,您的navigationController已经自动释放,因此理论上它应该最终解除分配,只要没有其他人retain编辑它。

另一方面,navigationController的视图已作为子视图添加到另一个子视图中,这意味着它由父视图保留。这是一个问题,因为如果视图对控制器有任何调用,那么这些调用将转到释放的对象。 99%的时间你得到EXC_BAD_ACCESS,你的应用程序崩溃了。另外1%更糟糕。

幸运的是,为了防止上述灾难,您需要做的就是找到一些“拥有”您的导航控制器,给它一个@property(保留)并将导航控制器分配给它。 (保持自动释放,那部分是好的) 拥有导航控制器的合适人选是父视图的视图控制器和应用程序委托。

这样,只要需要,控制器就会一直存在,因为它至少会被保留一次。

这里重要的是控制器和视图之间的区别。视图对象被保留,控制器对象被分配然后自动释放,所以它已经消失,除非你保留它。

答案 1 :(得分:1)

addSubview:保留navigationController.view。将其从父releases中删除。由于您自动释放它,您不需要保留它或释放它 - 它将为您处理。

答案 2 :(得分:0)

不,视图控制器不会被释放,因为视图控制器的视图是视图控制器的属性。视图控制器的视图与视图控制器不是同一个对象。您没有将视图控制器添加到父视图。