【问题标题】:IPhone SDK - Leaking Memory with performSelectorInBackgroundiPhone SDK - 使用 performSelectorInBackground 泄漏内存
【发布时间】:2011-01-27 08:44:33
【问题描述】:

也许有人可以帮我解决这个奇怪的事情:

如果用户点击一个按钮,一个新的 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 ?还是先检查一下?

提前致谢!

【问题讨论】:

  • 您好,泄漏在 getController 方法中。
  • 嗯,在哪里?你不发布workController??

标签: iphone memory-leaks


【解决方案1】:

不,小的内存泄漏不会(很可能)您的应用程序被应用商店拒绝。

在您的示例中,当您在单独的线程中运行方法时,您应该为该线程创建和处置 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];
}

有关详细信息,请参阅内存管理指南中的Autorelease Pools 部分。相关引述:

如果你产生一个辅助线程,你 必须创建自己的自动释放池 线程一开始 执行;否则,你会泄漏 对象。 (详情请见“Autorelease Pools and Threads”。)

【讨论】:

  • 首先 - 感谢您的回复。但是 NSAutorelease 池在哪里使用?不是刚刚分配释放了吗?
  • 谢谢!使用池就可以了。它现在可以正常工作而不会泄漏(并且可以将视图推送到后台线程中的堆栈)
  • NSAutoreleasePool 处理自动释放的对象并确保它们将被实际释放。尽管您看起来只是创建和发布它,但它做了很多工作。
【解决方案2】:

顺便说一句,您正在从后台线程调用pushViewController:。这很糟糕。

您应该只从主线程对 UI 进行操作 - 例如推送视图控制器和更改 UI 项。如果你不这样做,事情就会破裂。

请参阅标题为“可可框架线程安全吗?”的 Cocoa 基础指南部分:它说“所有 UIKit 对象都应仅在主线程上使用。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2010-11-23
    • 2011-12-10
    相关资源
    最近更新 更多