添加没有navigationController的子视图时正确释放ViewController
Posted
技术标签:
【中文标题】添加没有navigationController的子视图时正确释放ViewController【英文标题】:Properly release ViewController when adding subview without navigationController 【发布时间】:2011-01-31 21:52:44 【问题描述】:当将 ViewController.view 添加为不在导航控制器上的子视图时,我经常遇到的问题是无法正确创建和销毁 ViewController。
例如:
MyViewController *myViewController = [[MyViewController alloc] init];
[currentView addSubView:myViewController.view];
[myViewController release];
如果它是一个无控制器视图并且没有用户必须与之交互的 UIControls,那效果很好。但是向该视图的视图控制器发送消息会导致 EXEC_BAD_ACCESS,因为它们不再在内存中。
MyViewController *myViewController = [[MyViewController alloc] init];
[currentView addSubView:myViewController.view];
这在发送消息时有效,但它是内存泄漏并被静态分析器捕获。
有时将其设置为当前视图控制器的属性。但是,如果我需要创建一个数量未知的 MyViewController 并将它们添加到 UIScrollView 之类的东西中,那也行不通。
for (int i = 0; i < [myViewControllers count]; i++)
MyViewController *myTmpViewController = [[MyViewController alloc] init];
[myCurrentUIScrollView addSubview:myTmpViewController.view];
[myTmpViewController release];
如果 myTmpViewController 有用户交互或类似的东西,仍然会崩溃。如何添加并正确发布它?
【问题讨论】:
【参考方案1】:你可以有一个 NSMutableArray 并在那里添加控制器。
for (int i = 0; i < [myViewControllers count]; i++)
MyViewController *myTmpViewController = [[MyViewController alloc] init];
[myCurrentUIScrollView addSubview:myTmpViewController.view];
[myControllers addObject:myTmpViewController];
[myTmpViewController release];
// ..
- (void) dealloc
[super dealloc];
[myControllers release];
【讨论】:
【参考方案2】:您可以将指向视图控制器的指针存储在 ivar 中,然后在您的 dealloc
方法中释放它。
【讨论】:
【参考方案3】:如果这样的子视图具有有限的“控制需求”,那么您可以考虑从 UIView 子类化并拥有视图控制本身(例如,成为它自己的委托)
否则,您需要为这些视图控制器(通常是父视图的视图控制器)确定最合乎逻辑的“所有者”,并使它们成为其所有者的 ivars。
【讨论】:
我更愿意在典型约定允许的范围内尽可能接近 MVC。以上是关于添加没有navigationController的子视图时正确释放ViewController的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 NavigationController 的情况下推送子 ViewController?
关闭没有 NavigationController 的推送视图控制器
添加NavigationController不会显示后退按钮
向未推送到堆栈的 NavigationController 添加视图