Iphone 什么';向自动释放池发送释放或释放之间的区别是什么?

Iphone 什么';向自动释放池发送释放或释放之间的区别是什么?,iphone,cocoa,cocoa-touch,memory-management,autorelease,Iphone,Cocoa,Cocoa Touch,Memory Management,Autorelease,我在很多书和网站上看到了“排水”。嗯,对于一个听起来很酷的自动释放池来说。但是除了发布之外,它还能做什么呢?我猜-drain只是让池释放它的所有对象,而不释放池本身。猜一猜。如果您的系统有垃圾收集,则为GC发送消息(如果需要,则为objc_collect_) 如果您没有GC,那么drain=releaseOxigen是正确的,请参阅以下方法的文档drain: 在引用计数环境中, 释放并弹出接收器;在一个 垃圾收集环境, 如果 自上次事件以来分配的内存 集合大于当前值 门槛 请注意,关于oxige

我在很多书和网站上看到了“排水”。嗯,对于一个听起来很酷的自动释放池来说。但是除了发布之外,它还能做什么呢?我猜-drain只是让池释放它的所有对象,而不释放池本身。猜一猜。

如果您的系统有垃圾收集,则为GC发送消息(如果需要,则为objc_collect_)


如果您没有GC,那么drain=release

Oxigen是正确的,请参阅以下方法的文档
drain

在引用计数环境中, 释放并弹出接收器;在一个 垃圾收集环境, 如果 自上次事件以来分配的内存 集合大于当前值 门槛


请注意,关于oxigen的答案的评论说-drain不会释放NSAutoreleasePool是不正确的。报告中明确指出-排水管释放(并因此破坏)NSAutoreleasePool


-drain是使用-release替换NSAutoreleasePool对象的方法,唯一的区别是向垃圾收集系统提供提示。

-retain和-drain方法不会更改NSAutoreleasePool对象的retainCount,它们只向池中我不知道的所有对象发送释放消息,NSAutoreleasePool对象如何以及何时销毁((不,drain确实会释放池。在自动释放池和保留计数方面没有什么神奇之处,它们遵循与任何其他对象相同的规则,只是它们不能被保留或自动释放(无论如何这没有多大意义).Marc Charbonneau但是为什么我可以写:NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];[pool release];[pool release];[pool release];[pool release];[pool release];…[pool release];这是有效的。即使在这之后,pool retainCount=1这也不应该。实际上,ARP应该在释放后被破坏,对吗?oxigen,在你的例子中,释放后没有分配,所以你可能只是与一个被破坏对象的完整但现在是垃圾内存进行交互。仅仅因为对一个被破坏对象的调用Object碰巧工作并不意味着调用有效。至于retainCount返回1,可能retainCount总是为NSAutoreleasePool返回1,因为它具有不同寻常的retain语义。即使有一些实现细节使其持续时间稍长,因为文档明确指出它在耗尽或释放时被释放d您应该假设是这样。谢谢。所以在iPhone操作系统上,最好使用-release而不是-drain?在非GC环境中,它们是一样的。除非在极少数情况下,如果代码曾在GC模式下使用,您不想出于某种原因向GC系统提供提示,否则没有理由在代码targetin中使用release而不是draing 10.4+。苹果事先不知道是否有人会将其程序目标设定为10.4之前的版本,而且在退出之前向GC系统提供提示也没有任何价值,在特定情况下,发布版本是一个更好的选择。