objective-c - 为什么release不将指针设置为nil而是让它指向已释放的内存?

标签 objective-c cocoa memory-management

在下面的代码中,alert被分配、初始化、显示,然后释放。发布前后,alert仍然指向同一个地址。为什么release后系统没有将alert指针设置为nil?:

 -(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];
    }

最佳答案

我。因为即使它是合适的,release 也不能(也不会)对其调用的对象指针执行任何操作,因为与 C 中的任何内容一样,它是按值传递的。此外,在手动引用计数下,指针永远不会隐式设置为 nil,这是 ARC 下指针的一个功能。

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

关于objective-c - 为什么release不将指针设置为nil而是让它指向已释放的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15917219/

相关文章:

c# - 有没有一种简单的方法可以在C#中模拟Objective-C类别?

ios - 如何在 Swift 项目中使用 Obj-c 库/自定义接口(interface)

cocoa - 如何在Mavericks中通过代码打开新的表情菜单

objective-c - Cocoa 应用程序在任何 GL 函数上提供 EXC_BAD_ACCESS

java - 在循环期间动态写入 CSV

iphone - 如何修复应用程序用户报告的崩溃?

ios - UINavigationBar setItems/pushNavigationItem/popNavigationItem 的自定义动画?

swift - NSMenuItem 设置状态不起作用

c++ - 为什么我会收到堆损坏错误?

android - 大堆大小的原因定位和补救