在ARC下将对象多次赋值给变量

时间:2012-07-25 14:48:21

标签: ios

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

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

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

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:1)

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

答案 2 :(得分: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

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