【问题标题】:What is the difference between alloc, retain and copy分配、保留和复制有什么区别
【发布时间】:2011-05-04 09:07:09
【问题描述】:

这似乎是一个简单的问题,但我真的不知道何时应该使用分配、保留或复制。

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    请阅读this 长篇关于内存管理的教程。阅读全文可能需要一些时间,但它很好地解释了基本内容。

    编辑:关于复制 - 当您使用保留时,您只是在增加对象的保留计数。但是当您使用复制时,会创建对象的单独副本(浅副本)。分离意味着它是一个不同的对象,保留计数为 1。

    例如,

    NSObject *obj1 = [[NSObject alloc] init]; // obj1 的保留计数为 1 // obj1 和 obj2 都引用同一个对象。现在保留计数 = 2 // 通过 obj1 进行的任何更改都会被 obj2 看到,反之亦然,因为它们指向同一个对象 NSObject *obj2 = [obj1 保留]; // obj3 是对象的单独副本。它的保留计数为 1,就像新分配的对象一样 // 通过 obj3 更改不会影响 obj1 或 obj2,反之亦然,因为它们是单独的对象 NSObject *obj3 = [obj1 副本];

    【讨论】:

    • 谢谢。本教程确实解释了保留的含义以及相当多的基本内存管理,但并没有真正解释复制方法的作用。是否有更多关于内存管理或分配内存部分的教程?谢谢
    • 还有时间,请查看 William Remacle 建议的内存管理详细指南。
    • 值得注意的是,-copy 并不总是创建“对象的单独副本”。对于不可变的 Foundation 类(例如NSStringNSArray 等),不需要复制对象,因为它永远不会改变——-copy 方法只是保留对象。
    【解决方案2】:

    Alloc:当你需要进行内存分配时(你想创建一个对象,你需要为其分配内存空间)

    每个对象都有一个保留计数,它指示对该对象拥有所有权的对象的数量。它使用 alloccopy 自动完成(复制意味着您想要该对象的副本)。但是您也可以使用 retain 关键字来做到这一点。

    当 retain count == 0 时,将调用对象 dealloc 方法并释放该对象中的所有分配。

    我希望它足够清楚。 如果您想了解更多信息:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 2011-01-24
      • 2013-02-23
      • 2020-08-12
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      相关资源
      最近更新 更多