1

在下面的代码中,alert被分配和初始化,显示,然后释放。释放前后,alert仍然指向同一个地址。为什么系统没有将alert指针设置为nilafter 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

4 回答 4

3

I. 因为即使它是适当的,release也不能(也不会)对调用它的对象指针做任何事情,因为就像 C 中的任何事情一样,它是按值传递的。此外,在手动引用计数下,指针永远不会隐式设置为,这是ARCnil下指针的一个特性。weak

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

于 2013-04-10T04:58:59.487 回答
1

因为alert指向的对象还在附近。它显示在屏幕上,因此无法从内存中删除。

呼叫release只会告诉系统“我已经完成了”。它不会显式地从内存中删除任何东西,直到系统(以及任何其他持有指向该对象的指针的对象)也完成了它。

于 2013-04-10T04:55:59.380 回答
1

像这样发送的消息不可能更改非本地指针的值。你必须做一个任务:

alert = [alert release];

请注意,当您使用 ARC 编译时,有可用的弱指针,当指向的对象被销毁时,它确实使用运行时库来nil输出您的变量。

其次,release不负责销毁对象。在许多情况下,对象在发送后实际上仍然存在release,因为它还有其他所有者。

于 2013-04-10T04:58:59.797 回答
0

指针保存“那个东西的地址”。release转到“那件事” 。它们是不同的内存位置。

于 2013-04-10T04:58:23.343 回答