【发布时间】:2011-05-04 09:07:09
【问题描述】:
这似乎是一个简单的问题,但我真的不知道何时应该使用分配、保留或复制。
【问题讨论】:
标签: iphone objective-c memory-management
这似乎是一个简单的问题,但我真的不知道何时应该使用分配、保留或复制。
【问题讨论】:
标签: iphone objective-c memory-management
请阅读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 副本];【讨论】:
-copy 并不总是创建“对象的单独副本”。对于不可变的 Foundation 类(例如NSString、NSArray 等),不需要复制对象,因为它永远不会改变——-copy 方法只是保留对象。
Alloc:当你需要进行内存分配时(你想创建一个对象,你需要为其分配内存空间)
每个对象都有一个保留计数,它指示对该对象拥有所有权的对象的数量。它使用 alloc 和 copy 自动完成(复制意味着您想要该对象的副本)。但是您也可以使用 retain 关键字来做到这一点。
当 retain count == 0 时,将调用对象 dealloc 方法并释放该对象中的所有分配。
我希望它足够清楚。 如果您想了解更多信息:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
【讨论】: