0

我是 iPhone / Mac 领域的新手,这可能是一个非常基本的问题,我进行了一些搜索,但没有找到直接答案。

我想知道 Arrays / Mutable Arrays 的 addObject 方法在添加时是浅的(仅指针)还是深的(复制对象)。

  1. 已分配的可变数组
  2. 一个 NSString 已经分配了某种 init
  3. 我们将字符串添加到可变数组中
  4. 然后我们释放 NSString

如果这是做事的正确方法,则假定 addObject 将对 NSString 进行深层复制。只需确认这是使用可变数组进行内存管理的正确方法......

4

2 回答 2

2

addObject:做一个浅拷贝。您缺少的是NSMutableArray保留对象,因此它不会消失,但不需要深拷贝。这是 Objective-C 内存管理的关键点。您应该阅读内存管理编程指南。Cocoa 内存管理并不复杂,而且非常一致。我在三个魔术词上有一个简短的摘要。

于 2011-04-16T15:29:51.793 回答
2

将对象添加到数组时,其保留计数将增加。一个对象在其保留计数为 0 时将被释放。因此,当将 NSString 添加到您的 anArray 时,它不会是副本(您可以更改 foo,它也会在数组中更改)但它会增加 foo 的保留计数由 1。

NSString *foo = [[NSString alloc] initWithString@"bar"]; // retain count +1
[anArray addObject:foo]; // NOT COPIED, but retain count of 'foo' increased by 1
[foo release]; // retain count of foo decreased by 1

当你在某个时候释放一个数组时,它会在它的对象上调用释放。所以 foo 的保留计数最终会变为 0 并且 foo 将被释放。

// some time later..
[anArray release]; // anArray released, foo retain count = 0.. foo gets released.

亲切的问候,基督徒

于 2011-04-16T15:30:13.123 回答