簡體   English   中英

iPhone SDK-使用performSelectorInBackground泄漏內存

[英]IPhone SDK - Leaking Memory with performSelectorInBackground

也許有人可以幫我解決這個奇怪的事情:

如果用戶單擊按鈕,則會將新的UITableView推送到導航控制器。 這個新視圖正在執行一些數據庫查詢,這需要一些時間。 因此,我想在后台進行加載。

在不泄漏內存的情況下有效的方法(但是會凍結屏幕直到一切完成):

WorkController *tmp=[[WorkController alloc] initWithStyle:UITableViewStyleGrouped];
self.workController=tmp;
[tmp release];

[self.workController loadList]; // Does the DB Query
[self.workController pushViewController:self.workController animated:YES];  

現在,我嘗試這樣做:

    // Show Wait indicator
    ....

    WorkController *tmp=[[WorkController alloc] initWithStyle:UITableViewStyleGrouped];
    self.workController=tmp;
    [tmp release];

    [self performSelectorInBackground:@selector(getController) withObject:nil];
}

-(void) getController {
    [self.workController loadList]; // Does the DB Query
    [self.navigationController pushViewController:self.workController animated:YES];
}

這也可以,但是正在泄漏內存,我不知道為什么! 你能幫我嗎 ?

順便說一句-應用程序是否有可能在內存泄漏小的情況下進入AppStore? 還是首先要檢查?

提前致謝 !

不,少量內存泄漏不會(最有可能)將您的應用程序從Appstore中拒絕。

在示例中,當您在單獨的線程中運行方法時,應創建並放置NSAutoreleasePool對象,以便該線程處理自動釋放的對象。 getController方法進行以下更改應該可以解決問題:

-(void) getController {
    NSAutoreleasedPool *pool = [[NSAutoreleasedPool alloc] init];

    [self.workController loadList]; // Does the DB Query
    [self.navigationController pushViewController:self.workController animated:YES];

    [pool release];
}

有關更多詳細信息,請參見內存管理指南中的“ 自動釋放池”部分。 那里的相關報價:

如果生成輔助線程,則必須在線程開始執行后立即創建自己的自動釋放池。 否則,您將泄漏物體。 (有關詳細信息,請參見“自動釋放池和線程” 。)

順便說一句,您正在從后台線程調用pushViewController: 這不好。

您只應從主線程對UI進行操作(例如推送視圖控制器和更改UI項)。 如果不這樣做,事情就會崩潰。

請參閱標題為“可可框架線程安全嗎?”的“可可基礎指南”部分:內容為“所有UIKit對象應僅在主線程上使用”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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