3

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

4

3 回答 3

1

您可以将指向视图控制器的指针存储在 ivar 中,然后在您的dealloc方法中释放它。

于 2011-01-31T21:55:06.570 回答
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];
}

于 2011-01-31T21:55:34.867 回答
0

如果这样的子视图具有有限的“控制需求”,那么您可以考虑从 UIView 子类化并拥有视图控制本身(例如,成为它自己的委托)

否则,您需要确定这些视图控制器(通常是父视图的视图控制器)最合乎逻辑的“所有者”,并使它们成为其所有者的 ivars。

于 2011-01-31T23:01:44.700 回答