在没有navigationController的情况下添加子视图时正确释放ViewController

时间:2011-01-31 21:52:44

标签: iphone objective-c ios uiviewcontroller retaincount

当我将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具有用户交互或类似的东西,仍会崩溃。如何添加它并正确释放它?

3 个答案:

答案 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。