1

内存管理有一点我不是 100% 清楚,假设有以下代码:

{
NSString *string = [[NSString alloc] init];
string = [[NSString alloc] init];
}

这会导致第一次分配的内存泄漏吗?如果不是为什么不呢?

4

3 回答 3

2

在 ARC 下,这不会泄漏内存。这是因为任何时候强对象指针发生变化,编译器都会自动向release旧对象发送一个。局部变量,如NSString *string,默认情况下是强变量。

所以你上面的代码被编译成更像这样的东西:

{
NSString *string = [[NSString alloc] init];

// Oh, we're changing what `string` points to. Gotta release the old value.
[string release];
string = [[NSString alloc] init];
}
于 2012-07-25T14:53:22.213 回答
1

不,它不会导致泄漏。ARC 将在设置第二个字符串之前释放第一个字符串。这就是ARC真正惊人的力量!

于 2012-07-25T14:53:20.990 回答
1

从概念上讲,BJ 是正确的,但生成的代码略有不同。它是这样的:

NSString *string = [[NSString alloc] init];

// Oh, we're changing what `string` points to. Gotta release the old value.
NSString *tmpString = string;
string = [[NSString alloc] init];
[tmpString release];
[string release]; // string goes out of scope at this point in your code

这个操作顺序通常不是那么重要(如果你在意它,你可能编码不正确)。但是理解它可以解释为什么物体在它们被摧毁的时候就被摧毁了。

于 2012-07-25T15:21:03.397 回答