将对象传递给未分配的指针

时间:2011-03-03 05:49:31

标签: objective-c pointers

假设我已经声明了像这样的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作为示例,但我实现了不同的类。我 试图强调内存分配如何在这里工作。注意澄清和解释?

3 个答案:

答案 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怎么样?它不会返回到免费商店并且躺在那里,程序终止之前没有程序可以访问。因此给内存泄漏。希望它有助于理解。