Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么垃圾收集不能与线程一起工作?_Objective C_Cocoa_Garbage Collection_Nsoperation - Fatal编程技术网

Objective c 为什么垃圾收集不能与线程一起工作?

Objective c 为什么垃圾收集不能与线程一起工作?,objective-c,cocoa,garbage-collection,nsoperation,Objective C,Cocoa,Garbage Collection,Nsoperation,在我分离一个线程从文件中读取音频数据并对其进行处理之前,我的应用程序中的每件事情都可以正常工作 无论我做什么,垃圾收集似乎都不知道这个线程上发生了什么。我已经尝试过[NSThread self]、[NSThread currentThread]、[NSGarbageCollector defaultCollector]CollectifRequired]和CollectExtreatvly]。 我从NSThread使用NSOperationQueue切换到NSOperation 这些建议的解决方

在我分离一个线程从文件中读取音频数据并对其进行处理之前,我的应用程序中的每件事情都可以正常工作

无论我做什么,垃圾收集似乎都不知道这个线程上发生了什么。我已经尝试过[NSThread self]、[NSThread currentThread]、[NSGarbageCollector defaultCollector]CollectifRequired]和CollectExtreatvly]。 我从NSThread使用NSOperationQueue切换到NSOperation

这些建议的解决方案都不起作用。最近,我从NSMutableArray切换到

Float32*pfArray=calloc(numFloats,sizeof(Float32))

保存我的数据,并使用
free(pfArray)
释放记忆。这是更好的工作,但仍有相当数量的泄漏

在Activity Monitor中指示的“real mem”达到某个任意数字后,垃圾收集似乎在某种程度上开始工作,但当它确实工作时,它不会释放所有正在使用的内存。它只是不让它超过任意的阈值


我已经读到GC是一条路要走,但现在我不确定,并且有一个几乎完全编写好的程序。任何建议都会很有帮助。谢谢大家!

垃圾收集确实可以在应用程序的所有线程上运行。您可能无意中将对某个对象的引用保留为根对象,从而泄漏了一个子图;但是,如果没有原始代码,就没什么可说的了。

垃圾收集确实可以在应用程序的所有线程上工作。您可能无意中将对某个对象的引用保留为根对象,从而泄漏了一个子图;但是,如果没有原始代码,就没有什么可说的。

collectIfNeeded
”意味着如果不需要收集,它将不会收集


使用Instruments的Heapshot功能(分配工具的一部分)找出哪些对象仍然处于活动状态,并使用其对象图工具找出哪些对象仍然保留在您认为不再需要的对象上。

CollectifRequired
”意味着如果不需要收集,它将不会收集


使用Instruments的Heapshot功能(分配工具的一部分)找出哪些对象仍然活着,并使用其对象图工具找出哪些对象仍然保留在您认为不再需要的对象上。

Dead on;收集器在线程应用程序中工作得非常好。在线程化应用程序中,它比非GC代码的效率要高得多。如果没有更多的证据,很难说你做错了什么。我必须补充一点,重读这个问题,他有可能混合了非托管内存调用(基于malloc的)和托管内存调用。但同样,没有原始来源,很难提出建议;收集器在线程应用程序中工作得非常好。在线程化应用程序中,它比非GC代码的效率要高得多。如果没有更多的证据,很难说你做错了什么。我必须补充一点,重读这个问题,他有可能混合了非托管内存调用(基于malloc的)和托管内存调用。但同样,没有原始来源,很难提出建议。谢谢你的帮助,我以前从未使用过仪器。我已经堵住了漏洞,但我仍然不完全明白为什么堵住了。我让程序停止泄漏的唯一方法是从我的
[NSOperation main]
代码中取出所有alloc、malloc和callocs。所以在我看来,GC无法跟踪NSOperation内部的分配。@subby:GC只跟踪Cocoa对象;使用
malloc
realloc
calloc
分配的任何内容,您仍然必须释放。您将使用
alloc
创建的对象存储在哪里?有一些低级函数可以分配GC的内存,只要记得标记所有与
\uu strong
一起使用的
void*
,就可以让编译器知道。请参阅《感谢您的帮助》中的
NSAllocateCollectable
,我以前从未使用过仪器。我已经堵住了漏洞,但我仍然不完全明白为什么堵住了。我让程序停止泄漏的唯一方法是从我的
[NSOperation main]
代码中取出所有alloc、malloc和callocs。所以在我看来,GC无法跟踪NSOperation内部的分配。@subby:GC只跟踪Cocoa对象;使用
malloc
realloc
calloc
分配的任何内容,您仍然必须释放。您将使用
alloc
创建的对象存储在哪里?有一些低级函数可以分配GC的内存,只要记得标记所有与
\uu strong
一起使用的
void*
,就可以让编译器知道。请参见中的
NSAllocateCollectable