我可以在发布ViewController时保留视图吗?

问题描述:

我想加载一个新的视图到现有的视图控制器,但我想从一个xib文件加载该视图。我的计划是创建第二个viewController(viewController1在下面的代码中),然后保留其视图,并释放我刚刚创建的viewController。我希望viewController会被释放,并且视图会停留,但这似乎并没有发生。我可以在发布ViewController时保留视图吗?

问题1:如果viewcontroller得到处理,无论视图的保留计数是什么,它的相关视图是否得到处理?在下面的示例代码中,您可以看到该视图在突然消失之前的保留计数为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 

你得到的不是告诉您观点已经释放了“发送到释放对象信息”的错误,那就是viewController1已被释放,因而你得到的发送“查看”消息时出错。 (请记住,在Objective C中,每个属性访问都会发送一条消息......)

但我不确定为什么视图的保留数每次跳跃3次。

+0

谢谢,我还没有弄清楚为什么保留数每次跳跃3次,但是我觉得这很麻烦,我只是试着重构一些东西来完全避免这个问题。我希望我有足够的声望在下面回答Hikaru的回答,同样也有帮助。 – niels 2009-07-15 05:36:49

这可能帮助:

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

其中自是现有的viewController。

此行是没有意义的

self.currentPageView=viewController1.view;

在viewController1的观点并未建立起来,因为该控制器的方法的loadView不叫

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

它并没有改变这个事实 - 当时viewController.view不存在。

注:所有controller.view建在viewDidLoad中/的loadView方法,并viewDidLoad中/的loadView不会叫,直到它会显示(如:pushController)

通常我不靠,因为保留柜台它不可靠。