我正在尝试将新视图加载到现有视图控制器中,但我想从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
答案 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)
通常我不依赖保留计数器,因为它不可靠。