【问题标题】:MemoryManagement内存管理
【发布时间】:2011-07-21 10:24:32
【问题描述】:

iphone 支持 GC(垃圾回收)吗?如果是,那么究竟什么是自动释放。任何人都可以回答我的问题吗?

因为 GC 做与自动释放相同的事情,即它在自己的时间释放它的内存

例如 stringwithformat 之类的一些函数是自动释放函数,请参阅此

NSXMLParser *xmlParser [[[NSXMLParser alloc] initWithData:xmlData] autorelease];

(xmlparser 对象也不能评论当这个对象内存被释放时)就像 GC 一样

简而言之,我认为 iphone 部分支持 GC

伙计们怎么说?

【问题讨论】:

    标签: iphone ipad memory memory-management


    【解决方案1】:

    iOS 不支持垃圾收集。垃圾收集将删除不再对它们有任何引用的任何对象。在 iOS 上,如果您没有对某个对象的引用,那么内存中的空间将会丢失并且您会发生内存泄漏。

    autoRelease 告诉一个对象在不久的将来释放。这在某些情况下很有用,例如返回在函数中创建的对象,您将无法释放它。

    例如:

    + (id) createNewObject { id *newObject = [[Object alloc] init]; [新对象自动释放]; 返回新对象; }

    在这种情况下,调用此函数的对象必须保留返回的对象,以便它不会从内存中删除。

    【讨论】:

      【解决方案2】:

      不,iPhone 不支持 GC。

      GC 不等于自动释放。即使使用自动释放,您仍然可能遇到内存管理错误,即内存泄漏和访问已释放的内存。释放和自动释放仍然需要与保留/分配平衡。

      自动释放的存在是为了让方法可以创建(分配和初始化)一个对象并以引用计数将为零但调用方法仍然可以访问它们的方式返回它们。

      【讨论】:

        【解决方案3】:

        iphone是否支持GC(垃圾回收)?

        没有。

        因为 GC 做与自动释放相同的事情,即它在自己的时间释放它的内存

        他们做的事情并不完全一样。 Autorelease 非常具体地说明了它释放对象的时间:你知道它什么时候会发生。

        向对象发送自动释放将在当前自动释放池下一次耗尽时释放内存。自动释放池是一个跟踪已发送的对象autorelease 的东西。

        默认情况下,只有一个自动释放池,并且每次运行循环都会耗尽(即释放其所有对象)。

        运行循环就是这样工作的。每次发生事件(例如计时器触发或用户与应用程序交互)时,运行循环都会确定哪个对象应该处理该事件并调用适当的方法。当该方法返回时,运行循环将继续执行下一个事件,但在此之前它会耗尽其自动释放池。 (这有点简化,但足以理解这个概念。)

        这在实践中意味着什么? (我听到你哭了。)这意味着如果你在某个方法中自动释放一个对象,该对象实际上不会被发送release,直到该方法返回,并且调用它的方法返回,以及调用它的方法,依此类推,一直到顶部。这就是为什么在从方法返回对象时经常使用它的原因:您知道它们会持续足够长的时间以供调用者评估它们(并在需要时保留它们)。

        【讨论】:

          【解决方案4】:

          听起来您将发布与解除分配混为一谈。意识到释放一个对象不会从内存中删除它是非常重要的。释放一个对象通过减少保留计数告诉运行时您已完成该对象。当保留计数达到 0 时,对象实际上是从内存中释放的。所以autorelease和GC不一样,因为它只是自动释放对象,不会自动dealloc对象。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-21
            • 1970-01-01
            • 2016-10-12
            • 2012-06-14
            • 2012-08-12
            相关资源
            最近更新 更多