Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将对象传递给未分配的指针_Objective C_Pointers - Fatal编程技术网

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

Objective c 将对象传递给未分配的指针,objective-c,pointers,Objective C,Pointers,假设我已经声明了这样一个NSString NSString *myString = [[NSString alloc] initWithString:@"Never Heard"]; NSString *tempString; tempString = myString; [myString release]; 我的问题是为什么它会起作用?如你所见,我没有分配临时字符串。 因此,我认为没有必要发布它。但如果我尝试alloc和init 临时字符串,它将带来一个错误 NSString *myS

假设我已经声明了这样一个NSString

NSString *myString = [[NSString alloc] initWithString:@"Never Heard"];
NSString *tempString;

tempString = myString;

[myString release];
我的问题是为什么它会起作用?如你所见,我没有分配临时字符串。 因此,我认为没有必要发布它。但如果我尝试alloc和init 临时字符串,它将带来一个错误

NSString *myString = [[NSString alloc] initWithString:@"Never Heard"];
NSString *tempString = [[NSString alloc] init];

tempString = myString;

[myString release];
我使用NSString作为示例,但我实现了不同的类。我是 这里试图强调内存分配是如何工作的。想澄清和解释一下吗

tempString = myString;
在上面的语句中,
myString和tempString
都指向存储
“Never Hard”
的位置。因此,没有错误

我不明白你的意思是-
“但是如果我尝试alloc并初始化tempString,它会带来一个错误。”

编辑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"

从免费商店获得的内存位置_2如何。它不会返回到免费存储区,而是放在那里,在程序终止之前,没有程序可以访问它。从而导致内存泄漏。希望它在一定程度上有助于理解。

这绝对不是关于内存分配的。这就是指针的工作原理。执行此操作时:

tempString = myString;

tempString指向与myString相同的对象。因此,在tempString上调用任何方法与在myString上调用它们是一样的。

指针只是一个内存地址。只创建一个对象,然后将
tempString
指向该对象。和
tempString==myString

[myString release]
解除分配字符串,使两个指针都指向解除分配的内存


不要混淆变量和对象。变量只是用来访问对象的句柄。创建一个新变量并不意味着您正在创建一个新对象。

您所说的“但是如果我尝试分配并初始化tempString,它将带来一个错误”是什么意思?你能添加导致错误的代码吗?这是你的类内部的问题。我明白了。有一阵子我真的被它弄糊涂了。这是否意味着我可以创建任意多的指针,而不必担心内存问题?因为我认为每次我创建指针时,它都会分配小内存,即使它只需要几个字节来指向内存地址。@Sayz Lim您混淆了变量声明和内存分配。它确实占用了少量内存,在声明它的作用域退出时收集到内存(例如,方法完成)。但它指向的任何对象都可能仍然存在,这就是为什么需要对这些对象正确调用retain/alloc/release方法的原因。但通常情况下,对象在内存中比指针大得多。制造额外的指针并不是什么大问题。@squegy所以每当我声明变量时,不管它们是标准类型还是指针。一旦它们超出其作用域,它们的内存就会被释放(就像每次执行并退出方法一样)。我想我明白了。谢谢大家的帮助。本地变量和指针内存被释放,是的。但是指针引用的任何对象都会留在周围。这是一个非常重要的区别。这意味着我可以创建任意多的指针,而不必担心内存?事实上,当我试图对第二段代码进行你们称之为“浅拷贝”的操作时。它甚至无法运行,导致NSInvalidArgumentException错误。异常是运行时错误。因此,在这种情况下,您甚至不会得到运行时异常,而是内存泄漏。但如果您尝试将消息发送到已发布的对象,则会导致异常。仅仅声明一个指针并不意味着它指向一个有效的内存分配。当实际分配内存时,本文将对您有所帮助。胡特?这里根本没有浅复制或复制赋值运算符
tempString=myString
是将恰好位于
myString
中的任何指针大小的值赋值给
tempString
;它只不过是“把这4个字节或8个字节从这里推到你”。相当于说
x=5;y=x
@bbum-
NSString
不等同于
int
NSString
是一个类,它的复制赋值运算符函数应该显式声明为AFAIK。@bbum-明白了。在Obj-C中,每个对象都是指针。堆栈上没有驻留的对象。不过,用我的C++知识回答了它。我会改正的。谢谢你指出。