【问题标题】:iPhone Memory Management Concepts [duplicate]iPhone内存管理概念[重复]
【发布时间】:2012-10-27 11:27:01
【问题描述】:

可能重复:
Understanding reference counting with Cocoa and Objective-C

我对 iPhone 编程的内存管理概念和目标 C 感到很困惑。这是对 iPhone 应用程序性能最有用的概念。我想知道什么时候应该使用

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

[obj dealloc]

保留有什么用?它只是将 retainCount 增加 1。这对我来说确实是开销。 retainCount 如何帮助管理内存。帮我解决这个问题。

【问题讨论】:

  • 切勿在非 super 的情况下致电 dealloc。并且永远不要在- (void)dealloc 之外使用[super dealloc]。哦,永远不要看retainCount

标签: iphone objective-c ios


【解决方案1】:

你不应该调用 dealloc 方法.... 自动释放池用于线程环境和其他一些地方。..

在 ios 5+ 中有一件事,你不用担心保留,释放所有这些东西.. ARC 会处理所有事情

【讨论】:

【解决方案2】:

您必须从 Apple.developer 的内存管理基础开始。

阅读 Memory Management

阅读Memory Management Policy

here下载文档

【讨论】:

    【解决方案3】:

    保留计数 > 0 将向自动释放池表明您的对象仍在使用中,其他对象或其所有者仍需要该对象等。当此计数达到零时,这自动意味着该对象是不再需要,所以它将被释放。一般来说,每个 alloc/init、copy、create 或 retain 都必须有其等效的 release/autorelease。

    还有[obj dealloc],不是一个好习惯。推荐使用 [obj release] 或 [obj autorelease]。

    【讨论】:

      【解决方案4】:

      在引用计数环境中(与使用垃圾收集的环境相反),NSAutoreleasePool 对象包含已收到自动释放消息的对象,并且在耗尽时它会向每个对象发送释放消息。因此,向对象发送 autorelease 而不是 release 可以延长该对象的生命周期,至少直到池本身被耗尽(如果该对象随后被保留,则可能会更长)。一个对象可以多次放入同一个池中,在这种情况下,每次放入池中都会收到一条释放消息。

      ClassA *a = [[ClassA alloc]init]; 这里 a 的保留计数为 1,并且 a 只有一个所有者。 [保留]; 现在,a 的保留计数为 2,并且它有两个所有者。

      现在您需要释放 'a' 对象两次。否则会导致内存泄漏

      【讨论】:

        【解决方案5】:

        创建新线程时需要创建自己的自动释放池。

        永远不要打电话给[obj dealloc]

        retain、release等内存概念请参考:MemoryManagement 请参考这两个教程,它将帮助您更好地理解这个概念:

        1. ios-memory-management-basics
        2. memory-management-in-objective-c-tutorial

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-08
          • 2012-09-12
          • 1970-01-01
          • 2011-04-10
          • 2011-10-10
          • 2010-10-28
          相关资源
          最近更新 更多