假设我已经声明了像这样的NSString
NSString *myString = [[NSString alloc] initWithString:@"Never Heard"];
NSString *tempString;
tempString = myString;
[myString release];
我的问题是它为什么有效?如您所见,我没有为tempString分配。 因此,我认为没有必要发布它。但是如果我尝试分配和初始化 tempString,它会带来错误。
NSString *myString = [[NSString alloc] initWithString:@"Never Heard"];
NSString *tempString = [[NSString alloc] init];
tempString = myString;
[myString release];
我使用NSString作为示例,但我实现了不同的类。我 试图强调内存分配如何在这里工作。注意澄清和解释?
答案 0 :(得分:3)
指针只是一个内存地址。您只创建一个对象,然后将tempString
指向该对象。并tempString == myString
。
[myString release]
解除分配字符串,使两个指针都指向释放的内存。
不要将变量与对象混淆。变量只是用于访问对象的句柄。创建新变量并不意味着您正在创建新对象。
答案 1 :(得分:2)
这绝对不是关于内存分配。这就是指针如何工作。当你这样做时:
tempString = myString;
tempString指向与myString相同的对象。因此,调用tempString上的任何方法与在myString上调用它们相同。
答案 2 :(得分:1)
tempString = myString;
在上面的语句中,myString, tempString
都指向"Never Hard"
存储的位置。所以,没有错误。
我不明白你的意思 - "But if I try to alloc and init the tempString, it will bring an error."
修改1
第二个代码段是内存泄漏的一个例子。 tempString
被分配了内存位置。让我们继续使用示例 -
myString -> MemoryLocation_1 that has "Never Hard"
tempString -> MemoryLocation_2 and the location it is pointing to isn't intialized with any value.
Now, with this statement -
tempString = myString;
Both myString and tempString -> MemoryLocation_1 that has "Never Hard"
从免费商店获得的MemoryLocation_2怎么样?它不会返回到免费商店并且躺在那里,程序终止之前没有程序可以访问。因此给内存泄漏。希望它有助于理解。