当视图控制器在我创建gcd队列的行调用我的模型类方法时,我得到内存泄漏。有什么想法吗?
+(void)myClassMethod {
dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0); //run with leak instrument points here as culprit
dispatch_async(myQueue, ^{});
}
答案 0 :(得分:18)
你应该把它改成......
dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0);
dispatch_async(myQueue, ^{});
dispatch_release(myQueue);
...当您不再需要访问队列时,应该调用dispatch_release
。由于myQueue
是本地变量,因此必须在那里调用它。
阅读dispatch_queue_create文档:
<强>讨论强>
提交到队列的块按FIFO顺序一次执行一个。但是请注意,提交给独立队列的块可以相互同时执行。
当您的应用程序不再需要调度队列时,它应该使用dispatch_release函数释放它。提交到队列的任何挂起块都会保留对该队列的引用,因此在所有挂起块完成之前,不会释放队列。
答案 1 :(得分:4)
泄漏工具报告分配内存的位置,该内存不再包含代码中的任何引用。
在该方法运行之后,由于没有任何内容引用您创建的队列,并且从未调用dispatch_release(),因此将其视为泄漏。