簡體   English   中英

在沒有navigationController的情況下添加子視圖時正確釋放ViewController

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM