NSOperationQueue、内存和GCD;如何正确实施?
我对 NSOperation 和 GCD 有一些简单的疑问,但在文档中没有找到答案。
第一个问题与内存管理有关:
我想知道是否需要为要添加到 NSOperationQueue 的方法创建一个 Autorealease 池;类似于在没有 NSOperations 的情况下在不同线程上运行方法时。
下一个问题是 NSOperation 是否负责 GCD 还是需要手动完成?
感谢您的帮助!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我刚刚在这里看到你的问题,你可能会对 Apple 开发者论坛上的帖子感兴趣根据该线程上的一位苹果人员的说法,只要您通过 NSOperationQueue 运行 NSOperation,您就不需要创建自己的自动释放池,因为 NSOperationQueue 会为您完成此操作。
NSOperationQueue 的文档显然也需要更新/更正。在运行 iOS 4 或更高版本的设备上,无论类参考文档如何规定,NSOperationQueue 确实使用 GCD。
I just saw your question here and there is a post on the apple dev forums you might be interested in. According to one of the apple guys on this thread so long as you run your NSOperation through an NSOperationQueue you do not need to create your own autorelease pool as the NSOperationQueue does it for you.
Also the docs for NSOperationQueue apparently need to be updated/corrected. On devices running iOS 4 or later NSOperationQueue does use GCD despite what the class reference documents say.
根据文档,您应该在 NSOperation 的
main
方法中创建一个 NSAutoreleasePool。 NSIncationOperation 和 NSBlockOperation 的文档没有指定它们是否为您创建自动释放池,因此为了安全起见,最好在使用这些类时也创建一个自动释放池。NSOperationQueue 处理排队和执行操作,因此您不必自己为与操作队列相关的任务而扰乱 GCD。
According to the documentation, you should create an NSAutoreleasePool in the
main
method of your NSOperation. The documentation for NSInvocationOperation and NSBlockOperation doesn't specify whether they create an autorelease pool for you, so to be safe it would be best to create one when using those classes too.The NSOperationQueue handles queuing and executing the operations, so you shouldn't have to mess with GCD yourself for tasks related to the operation queue.