Ste*_*blo 0 iphone memory-leaks
也许有人可以帮我解决这个奇怪的事情:
如果用户单击按钮,则会将新的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];
Run Code Online (Sandbox Code Playgroud)
现在我试着这样做:
// 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];
}
Run Code Online (Sandbox Code Playgroud)
这也有效,但是内存泄漏,我不知道为什么!你能帮我吗 ?
顺便说一下 - 应用程序是否可能因内存泄漏而进入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];
}
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅内存管理指南中的" 自动释放池"部分.那里的相关报价:
如果生成辅助线程,则必须在线程开始执行后立即创建自己的自动释放池; 否则,你会泄漏物体.(有关详细信息,请参阅"自动释放池和线程".)
| 归档时间: |
|
| 查看次数: |
3588 次 |
| 最近记录: |