有一个内存管理点我不是100%清楚,假设有以下代码:
{
NSString *string = [[NSString alloc] init];
string = [[NSString alloc] init];
}
这会导致第一次分配的内存泄漏吗?如果不是为什么不呢?
答案 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
这个操作顺序通常不是那么重要(如果你太在乎 那么多,你的编码可能不正确)。但理解它解释了为什么物体在它们存在时会被完全摧毁。