在下面的代码中,alert
已分配并初始化,显示,然后释放。在发布之前和之后,alert
仍然指向相同的地址。为什么系统在alert
之后没有将nil
指针设置为release
?:
-(void) viewDidLoad {
UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @”Hello”
message: @”This is an alert view”
delegate: self
cancelButtonTitle: @”OK”
otherButtonTitles: @”Option 1”, @”Option 2”, nil];
[alert show];
[alert release];
[super viewDidLoad];
}
答案 0 :(得分:3)
予。因为即使它是合适的,release
也不能(也不会)对它被调用的对象指针做任何事情,因为,就像C中的任何东西一样,它是通过值传递的。此外,在手动引用计数下,指针永远不会隐式设置为nil
,这是ARC下weak
指针的一个特性。
II。无论如何,这都是错的。 UIAlertView
类在显示时将自身添加到某个视图作为子视图,因此它会被保留。因此,在您期望将其取消分配时,其引用计数不为零。
答案 1 :(得分:1)
因为alert
指向的对象仍然存在。它显示在屏幕上,因此无法从内存中删除。
调用release
只会告诉系统“我已经完成了”。除非系统(以及任何其他持有指向该对象的指针的对象)也完成,否则它不会从内存中显式删除任何内容。
答案 2 :(得分:1)
这样的消息发送不可能改变非本地指针的值。你必须做一个任务:
alert = [alert release];
请注意,使用ARC编译时可以使用weak pointers,当指向对象被销毁时,确实使用运行时库来nil
输出变量。
其次,release
不负责销毁对象。在许多情况下,在发送release
之后,对象实际上仍然存在,因为它有其他所有者。
答案 3 :(得分:0)
指针包含“那个东西的地址”。 release
转到“那件事”。它们是不同的记忆位置。