Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 为什么release不将指针设置为nil,而将指针指向已释放的内存?_Objective C_Cocoa_Memory Management - Fatal编程技术网

Objective c 为什么release不将指针设置为nil,而将指针指向已释放的内存?

Objective c 为什么release不将指针设置为nil,而将指针指向已释放的内存?,objective-c,cocoa,memory-management,Objective C,Cocoa,Memory Management,在下面的代码中,警报被分配、初始化、显示,然后释放。在发布之前和之后,警报仍然指向相同的地址。为什么系统在释放后不将警报指针设置为零 因为警报指向的对象仍然存在。它显示在屏幕上,所以不能从内存中删除 调用release只会告诉系统我已经完成了。它不会显式地从内存中删除任何内容,直到系统和任何其他包含指向该对象的指针的对象也使用它为止。因为警报指向的对象仍然存在。它显示在屏幕上,所以不能从内存中删除 调用release只会告诉系统我已经完成了。它不会显式地从内存中删除任何内容,直到系统和任何其他包

在下面的代码中,警报被分配、初始化、显示,然后释放。在发布之前和之后,警报仍然指向相同的地址。为什么系统在释放后不将警报指针设置为零

因为警报指向的对象仍然存在。它显示在屏幕上,所以不能从内存中删除

调用release只会告诉系统我已经完成了。它不会显式地从内存中删除任何内容,直到系统和任何其他包含指向该对象的指针的对象也使用它为止。

因为警报指向的对象仍然存在。它显示在屏幕上,所以不能从内存中删除


调用release只会告诉系统我已经完成了。它不会显式地从内存中删除任何内容,直到系统和任何其他包含指向该对象的指针的对象也使用它为止。

指针包含该对象的地址。释放是为了那件事。它们是不同的内存位置。

指针包含该对象的地址。释放是为了那件事。它们是不同的内存位置。

I。因为即使它是合适的,release也不能也不会对它被调用的对象指针做任何事情,因为它和C中的任何东西一样,都是通过值传递的。此外,在手动引用计数下,指针永远不会隐式设置为nil,这是ARC下弱指针的一个特性


二,。无论如何,这是错误的。UIAlertView类在显示时将自身作为子视图添加到某个视图中,因此它将被保留。因此,在您期望它被释放时,它的引用计数不是零。

I。因为即使它是适当的,release也不能也不会对它被调用的对象指针做任何事情,因为它与C中的任何东西一样,是按值传递的。此外,在手动引用计数下,指针永远不会隐式设置为nil,这是ARC下弱指针的一个特性


二,。无论如何,这是错误的。UIAlertView类在显示时将自身作为子视图添加到某个视图中,因此它将被保留。因此,在您期望它被释放时,它的引用计数不是零。

这样的消息发送不可能更改非本地指针的值。您必须完成一项作业:

alert = [alert release];
请注意,当您使用ARC编译时,有可用的方法,当指向的对象被销毁时,ARC确实使用运行时库将变量置零


第二,释放对摧毁目标不负责任。在许多情况下,在发送release之后,对象实际上仍然是活动的,因为它有其他所有者。

这样的消息发送不可能更改非本地指针的值。您必须完成一项作业:

alert = [alert release];
请注意,当您使用ARC编译时,有可用的方法,当指向的对象被销毁时,ARC确实使用运行时库将变量置零


第二,释放对摧毁目标不负责任。在许多情况下,该对象在发送释放后实际上仍处于活动状态,因为它有其他所有者。

你的意思是释放消息没有立即释放内存?不,没有,@DungProton,原来如此。耶,有人说释放消息立即释放内存,但有人说没有。这让我很困惑!!!@DungProton说,在较高的级别上,当您发布对该对象的最后所有权声明时,该对象不再对您有效。这就是你通常应该担心的;内存是否被释放并不重要。在较低的级别,当发送的释放导致对象的引用计数转换为0时,对象将被销毁。正如Chuck在你的另一个问题中指出的那样,你可以查看运行库,看看这到底是什么意思。你的意思是释放消息没有立即释放内存?不,没有,@DungProton,原来如此。耶,有人说立即释放消息释放内存,但有人说没有。这让我很困惑!!!@DungProton说,在较高的级别上,当您发布对该对象的最后所有权声明时,该对象不再对您有效。这就是你通常应该担心的;内存是否被释放并不重要。在较低的级别,当发送的释放导致对象的引用计数转换为0时,对象将被销毁。正如Chuck在你的另一个问题中指出的那样,你可以查看运行时库来了解它的确切含义initWithTitle:…@Yar?是的,这是合法的,尽管就ARC而言警报视图可以立即解除分配。谢谢Josh,这很酷,我不知道。我试图想象在什么情况下,如果有的话,这会有用。你是对的,自动nils的局部变量可能用处有限,@Yar,但如果你曾经
如果是这样,可能性是存在的!谢谢,我会留意一个用例+顺便说一句,关于这个答案,我今天发现了一个用例。在方法中,您正在使用对象A并对其进行修改。A属于另一个对象B。如果A在使用过程中被解除分配,因为B已处理完它,那么您希望处理的是nil,而不是1继续处理该对象,就像ARC正常处理一样,2获得SIGBART。您的意思是u弱UIAlertView*alert=[[UIAlertView alloc]initWithTitle:…@Yar?是的,这是合法的,尽管就ARC而言,警报视图可以立即解除分配。谢谢Josh,这很酷,我不知道。我试图想象在什么情况下,如果有的话,这会很有用。你是对的,自动nils的局部变量可能用处有限,@Yar,但是如果你需要的话它,可能性是存在的!谢谢,我会留意一个用例;+1这个答案,顺便说一句。我今天真的找到了一个用例。在你的方法中,你正在使用一个对象a并修改它。a属于另一个对象B。如果a在你的使用过程中被解除分配,因为B已经完成了它,你想使用nil而不是1 cont像ARC一样正常使用对象,2得到一个SIGBART。那么,为什么警报在消息发布后仍然存在?那么,为什么警报在消息发布后仍然存在?