【问题标题】:How do I release the ACTUAL memory and not just the pointer to the memory?如何释放实际内存而不仅仅是指向内存的指针?
【发布时间】:2010-11-23 14:38:07
【问题描述】:

我正在释放东西,但根据仪器,记忆似乎仍然存在。我只是释放指针而不是实际数据吗?如何在objective-c中发布数据? [anObject release][&anObject release] 有什么区别?

请原谅我缺乏关于内存和指针的知识。

【问题讨论】:

  • 我不认为“[&anObject release];”甚至是有效的 Objective-C。假设“anObject”的类型为“NSObject *”或“id”,这意味着“&anObject”将是指向对象指针的指针。

标签: objective-c pointers memory-management


【解决方案1】:
[anObject release];

告诉对象将其retain 计数减1。每次alloccopy 对象时,都会返回一个保留计数为1 的对象。然后,如果您再次retain 它,计数会增加。或者,如果你使用了一个 retain 属性,它会再次上升。

就像我说的那样,调用 release 会减少这个计数。当计数达到 0 时,将发送对象 dealloc(通过调用 [super dealloc])最终将释放用于该对象的所有内存。

还有autorelease,但我会把它留给你去发现。你应该阅读Memory Management docs。好好研究一下。

【讨论】:

    【解决方案2】:

    通常,内存分配器不会在释放后立即(甚至永远不会)将内存返回给操作系统。因此,如果您正在查看的检测使用操作系统级别的统计信息,那么即使您释放了一些动态分配的对象,它也不会看到使用率下降。

    【讨论】:

    • 哦。我不知道。我正在使用 iPhone SDK 的 Leaks Instrument,通常我可以看到对象分配(活动对象)的图表立即下降,但在这种情况下,它有所不同……顺便说一句,调用 [&anObject release] 有什么作用?
    • 我不知道。我一生中从未写过一行 Objective-C。
    【解决方案3】:
    [anObject release];
    

    具体来说,您是在告诉对象将其保留计数减 1。如果它恰好下降到零——它可能不是出于各种原因——然后 Objective-C 运行时将调用方法 @987654324 @ 然后将在所有对象类型实例变量上调用 -release(如果有的话,在 malloc 内存上调用 free())。

    这里没有魔法。 release 只是一个方法调用,就像任何其他方法调用一样。鉴于这个问题,我建议您阅读以下内容:

    http://developer.apple.com/IPhone/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

    而且,一旦您消除了调用方法的神秘感,请阅读本文以全面了解 iPhone 上的内存管理:

    http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

    【讨论】:

    • 酷——这样做。概念指南确实是一个很棒的起点。
    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2011-07-05
    • 2012-12-28
    • 2016-07-18
    • 2022-09-27
    • 2020-06-23
    相关资源
    最近更新 更多