1

我知道我的问题已经在 StackOverflow 上讨论过,但我发现答案并不完全符合我的需要。所以问题是:

NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
secondArray = [firstArray mutableCopy];

现在 secondArray 的保留计数是多少?2 还是 1?我应该释放它两次还是只释放一次?copy 或 mutableCopy 是否会增加 COPYING(在此事件中为 secondArray)对象的保留计数?

4

2 回答 2

5

您永远不应该关心绝对保留计数。只是你是“平衡的”,这意味着对于每一个alloc, new*, copy,mutableCopy并且retain你需要一个相应的releaseor autorelease(当不使用 ARC 时)。

如果您将此规则应用于每一行,您可以看到您的第二行有一个alloc,但没有释放。事实上,在这里分配一个实例是绝对没用的,因为你反正对它不感兴趣。所以它应该简单地阅读:

NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [firstArray mutableCopy];
// There is no third line.

但是让我们讨论一下您的原始代码,看看发生了什么:

NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
// secondArray points to a new instance of type NSMutableArray
secondArray = [firstArray mutableCopy];
// You have copied another array (created a new NSMutableArray
// instance) and have overwritten the pointer to the old array.
// This means that the instance allocated in line 2 is still there
// (was not released) but you don't have a pointer to it any more.
// The array from line 2 has been leaked.

在 Objective-C 中,我们经常谈到所有权:很少有方法可以让您成为对象的“所有者”。这些都是:

  • alloc
  • new*,如newFoo
  • copymutableCopy
  • retain

如果你调用这些,你会得到一个你负责的对象。这意味着您需要调用相应数量的release和/或autorelease这些对象。例如,如果你这样做就好了[[obj retain] retain];,然后[[obj autorelease] release];

于 2011-11-08T11:07:00.583 回答
1
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
secondArray = [firstArray mutableCopy];

发生的事情是您创建了内存泄漏。当您使用此行的 firstArray 的 mutableCopy 覆盖它时,您刚刚丢失了分配给 secondArray 的引用。

secondArray = [firstArray mutableCopy];

如果您随后释放 secondArray 两次,程序将崩溃,因为您随后过度释放了由分配的可变数组

secondArray = [firstArray mutableCopy];

您需要做的是确保您不会错误地覆盖保留的引用,并在发布时保持平衡。

于 2011-11-08T11:20:31.943 回答