gpt4 book ai didi

iphone - 如何正确使用 nsoperationqueue 的 autoreleasepool

转载 作者:行者123 更新时间:2023-12-03 21:09:05 26 4
gpt4 key购买 nike

我有一个正在重构的应用程序,我刚刚实现了多线程,以便 UI 可以运行得更流畅。在 iPhone 模拟器中,我没有遇到任何泄漏,但在运行 iOS 4.2 的 iPhone 3G 上进行测试时,出现了内存泄漏。我已经做了很多搜索,寻找使用操作队列实现自动释放池的正确方法,非常感谢您的帮助。

我在我的 View Controller 中创建了一个 nsoperationqueue

- (void)loadData
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSOperationQueue *queue = [NSOperationQueue new]; // creates multithread for loading data without slowing UI
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(firstRun) object:nil];

[queue addOperation:operation];
[operation release];
[queue release];
[pool release];
}

最佳答案

首先,您不应该只是创建然后释放队列。更自然的做法是创建该队列作为类的 ivars 之一,然后在 View Controller 消失时释放它(您还可以取消任何挂起的操作并取消/等待任何正在运行的操作完成)。

其次,您不需要在创建操作并将其添加到队列中的方法中使用自动释放池,因为该方法是从主线程调用的。相反,您需要对象实际调用的方法中的自动释放池(这可能在另一个线程上运行)。

因此,您可能有以下内容(假设您将队列命名为 ivarqueue_):

- (void)viewDidLoad
{
[super viewDidLoad];

if( !queue_ ) queue_ = [[NSOperationQueue alloc] init];
// other view loading code
}

- (void)loadData
{
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(firstRun) object:nil];
[queue_ addOperation:operation];
[operation release];
}

- (void)firstRun
{
// Here we may run on another thread, so 1) we need an autorelease pool; and
// 2) we need to make sure we don't do anything that requires a runloop
NSAutoreleasePool* threadPool = [NSAutoreleasePool new];

// do long-running things

[threadPool drain];
}

- (void)dealloc
{
if( queue_ ) {
[queue_ setSuspended:YES];
[queue_ cancelAllOperations];
// you need to decide if you need to handle running operations
// reasonably, but don't wait here because that may block the
// main thread
[queue_ release];
}
// other dealloc stuff
[super dealloc];
}

您还可以根据需要初始化队列,因此不必在 viewDidLoad 中初始化,而是检查队列是否存在,并在需要时在要添加操作的任何位置进行初始化。这可能包含在它自己的方法调用中,但这里的延迟初始化可能并不是真正必要的,因为队列非常轻量级。

关于iphone - 如何正确使用 nsoperationqueue 的 autoreleasepool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com