1

我正在尝试将新视图加载到现有视图控制器中,但我想从 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
4

3 回答 3

1

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

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

于 2009-07-10T01:17:24.623 回答
1

这可能会有所帮助:

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

其中 self 是现有的 viewController。

于 2009-07-10T05:01:28.740 回答
1

这条线毫无意义

self.currentPageView=viewController1.view;

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

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

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

注意:所有的 controller.view 都内置在 viewDidLoad/loadView 方法中,并且 viewDidLoad/loadView 不会调用,直到它要显示(例如 pushController)

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

于 2009-07-10T05:19:43.947 回答