我可以在释放ViewController时保留View吗?

时间:2009-07-10 00:26:49

标签: iphone cocoa-touch uiview uiviewcontroller

我正在尝试将新视图加载到现有视图控制器中,但我想从xib文件加载该视图。我的计划是创建第二个viewController(下面的代码中的viewController1),然后保留它的视图并释放我刚刚创建的viewController。我希望viewController会被释放,视图会一直存在,但这似乎并没有发生。

问题1:如果视图控制器被解除分配,无论视图的保留计数是什么,其关联视图是否都会被解除分配?在下面的示例代码中,您可以看到视图在突然消失之前的保留计数为13。

问题2:为什么保留视图会使其retainCount增加3?

PageViewController *viewController1 = [[PageViewController alloc] initWithNibName:@"Page1" bundle:nil];
[viewController1.view setUserInteractionEnabled:YES];

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=4

self.currentPageView=viewController1.view;

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=7


[viewController1.view retain];

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=10

[self.view addSubview:viewController1.view];

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=13

[viewController1 release];

NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); 
//objc[3237]: FREED(id): message view sent to freed object=0x538ce0

3 个答案:

答案 0 :(得分:1)

您收到的关于“发送给已释放对象的消息”的错误并未告诉您视图已被释放,而viewController1已被释放,因此当您向其发送“查看”消息时,您会收到错误消息。 (请记住,在Objective C中,每个属性访问都会发送一条消息......)

我不确定为什么视图的保留计数每次都会增加3。

答案 1 :(得分:1)

这可能会有所帮助:

[[NSBundle mainBundle] loadNibNamed:@"Page1" owner:self options:nil];

其中self是现有的viewController。

答案 2 :(得分:1)

这条线是没有意义的

self.currentPageView=viewController1.view;

viewController1中的视图尚未构建,因为该控制器中的方法loadView未被调用

虽然您可以将新的子视图添加到viewController.view中,因为“魔术”允许您将对象添加到尚未构建的视图中。

它不会改变事实 - 当时viewController.view不存在。

注意:所有controller.view都是在viewDidLoad / loadView方法中构建的,而viewDidLoad / loadView在显示之前不会调用(例如.pushController)

通常我不依赖保留计数器,因为它不可靠。