![](/img/trans.png)
[英]retaincount of ViewController +4 when pushed by NavigationController
[英]Properly release ViewController when adding subview without navigationController
當我將ViewController.view添加為不在導航控制器上的子視圖時,我遇到的很多東西都無法正確創建和銷毀ViewController。
例如:
MyViewController *myViewController = [[MyViewController alloc] init];
[currentView addSubView:myViewController.view];
[myViewController release];
如果它是一個無控制器視圖並且沒有用戶必須與之交互的UIControl,那就非常有效。 但是將消息發送到該視圖的視圖控制器會導致EXEC_BAD_ACCESS,因為它們不再在內存中。
MyViewController *myViewController = [[MyViewController alloc] init];
[currentView addSubView:myViewController.view];
這在發送消息時有效,但是它是內存泄漏並被靜態分析器捕獲。
將其設置為當前視圖控制器的屬性有時會起作用。 但是,如果我需要創建一堆具有未知數量的MyViewControllers並將它們添加到類似UIScrollView的東西,那么它也不起作用。
for (int i = 0; i < [myViewControllers count]; i++) {
MyViewController *myTmpViewController = [[MyViewController alloc] init];
[myCurrentUIScrollView addSubview:myTmpViewController.view];
[myTmpViewController release];
}
如果myTmpViewController具有用戶交互或類似的東西,仍會崩潰。 如何添加它並正確釋放它?
您可以在ivar中存儲指向視圖控制器的指針,然后在dealloc
方法中釋放它。
您可以擁有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];
}
如果這樣的子視圖限制了“控制需求”,那么您可以考慮從UIView繼承並擁有視圖控件本身(例如,是它自己的委托)
否則,您需要決定這些視圖控制器(通常是父視圖的視圖控制器)的最合理的“所有者”,並使它們成為其所有者的ivars。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.