当我将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具有用户交互或类似的东西,仍会崩溃。如何添加它并正确释放它?
答案 0 :(得分:1)
您可以在ivar中存储指向视图控制器的指针,然后在dealloc
方法中将其释放。
答案 1 :(得分: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 :(得分:0)
如果这样的子视图限制了“控制需求”,那么您可以考虑从UIView继承并拥有视图控件本身(例如,作为自己的委托)
否则,您需要决定这些视图控制器(通常是父视图的视图控制器)的最合理的“所有者”,并将它们作为其所有者的ivars。