NSOperationQueue 和内存

Posted

技术标签:

【中文标题】NSOperationQueue 和内存【英文标题】:NSOperationQueue and Memory 【发布时间】:2015-05-12 13:45:26 【问题描述】:

我一直在使用 NSOperationQueue,但我遇到了非常奇怪的内存问题。 我已经尝试将问题简化为最简单的问题,在这里我得到了:

在初始化中:

_queue = [[NSOperationQueue alloc] init];

稍后:

TestOperation op = [[TestOperation alloc] init];
[self.queue addOperation: op];

然后在main调用的方法中运行:

NSLog(@"I'm right here!");

如果我调用它数千次,我使用的内存只会不断增长。

我只从我的方法中删除了 NSLog(因此调用了一个空方法)我的记忆没有改变。

我在这里做错了什么??

【问题讨论】:

op 也是类的成员还是在函数内部?我看到您正在声明队列,就好像它在函数内部一样,但是您正在做类似 self.queue 的事情,我的意思是队列是该类的属性。 是的,抱歉,已更正,我只是尝试将重要的行放在这里。速度太快了。 什么叫千遍?你有没有开始你的操作队列。我闻到你一直在向一个从未开始的队列添加操作。 是的,它已启动并且打印在控制台中打印。我有一个简单的 for 循环,该循环调用该方法创建操作并将其添加到队列中一千次。有关内存增长的可能解释(我目前仍在调查),请参阅下面的其他评论。 【参考方案1】:

当您向 NSOperationQueue 添加操作时,操作队列拥有该对象并负责释放它。也许您没有给 NSOperationQueue 足够的时间来释放内存并查看结果?

对于这种情况,您可以用@autorelease 块包围它,但由于操作队列负责释放对象,我不知道它是否会起作用。值得一试。

【讨论】:

我只是想到了一些东西(尽管它没有解释为什么它没有以空方法改变内存)。我的队列容量随着我存储在其中的同时操作的数量而增长。因此,即使处理完所有操作,它所占用的内存也不会改变。我想我需要找到一种方法来改变它的操作 NSArray 的容量。

以上是关于NSOperationQueue 和内存的主要内容,如果未能解决你的问题,请参考以下文章

如何为 nsoperationqueue 正确使用 autoreleasepool

NSOperationQueue 阻塞不相关的 NSOperationQueue?

多线程编程NSOperationQueue

NSOperationQueue 和并发操作

gcd和NSOperationQueue区别

NSOperationQueue 和 ASIHTTPRequest