为什么release没有将指针设置为nil而不是让它指向释放的内存?

时间:2013-04-10 04:53:40

标签: objective-c cocoa memory-management

在下面的代码中,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];
    }

4 个答案:

答案 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转到“那件事”。它们是不同的记忆位置。