Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.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
Iphone 为什么您要耗尽自动释放池而不是释放它?_Iphone_Objective C_Cocoa_Macos - Fatal编程技术网

Iphone 为什么您要耗尽自动释放池而不是释放它?

Iphone 为什么您要耗尽自动释放池而不是释放它?,iphone,objective-c,cocoa,macos,Iphone,Objective C,Cocoa,Macos,为什么要耗尽自动释放池而不是释放它?一个原因是垃圾收集(iPhone上不可用) release是启用GC的no-op,但drain向垃圾收集器提供提示 从: 垃圾收集 在垃圾收集环境中,不需要自动释放池。但是,您可以编写一个框架,该框架设计用于垃圾收集和引用计数环境。在这种情况下,您可以使用自动释放池向收集器提示收集可能是适当的。在垃圾收集环境中,如果需要,向池发送排放消息将触发垃圾收集;然而,释放是不可操作的。在引用计数的环境中,排放与释放具有相同的效果。因此,通常应使用排水管而不是释放 这里

为什么要耗尽自动释放池而不是释放它?

一个原因是垃圾收集(iPhone上不可用)

release是启用GC的no-op,但drain向垃圾收集器提供提示

从:

垃圾收集 在垃圾收集环境中,不需要自动释放池。但是,您可以编写一个框架,该框架设计用于垃圾收集和引用计数环境。在这种情况下,您可以使用自动释放池向收集器提示收集可能是适当的。在垃圾收集环境中,如果需要,向池发送排放消息将触发垃圾收集;然而,释放是不可操作的。在引用计数的环境中,排放与释放具有相同的效果。因此,通常应使用排水管而不是释放

这里最好的答案是“因为苹果让你这么做”


遵循苹果的“最佳实践”是提高向前兼容几率的最佳方法。

早在今天,排水和释放是分开的。你必须打电话给排水管,然后释放。然而,因为你总是先把水排干,然后再把水放出来,所以它们就结合起来排干了。我认为他们一直在流失内存,因为手动内存管理过去非常重要,您需要能够准确地发现代码中的内存池流失的位置。呃,什么
-drain
是在10.4 SDK中添加的,特别是出于垃圾收集兼容性的原因。(垃圾收集在10.4中不可用,但一些基础工作已经完成。)必须这样做,因为在GC中不可能覆盖
-release
。在iPhone环境中,这是一个糟糕的答案。查看我的答案,了解使用
drain
@TechZen的更好理由:这是一个可可城传奇。正如Ahruman所指出的,
drain
作为
release
的同义词添加到10.4中。之所以使用这两种同义方法,是因为苹果的GC实现使
release
no-op,因此如果他们希望该方法在GC和MM环境中都能工作,就需要使用不同的选择器。