【问题标题】:Deallocated instance and nil object in objective-c在objective-c中释放实例和nil对象
【发布时间】:2014-01-28 08:25:41
【问题描述】:

来自java背景,一切都在空指针异常下,我发现在理解objective-c中nil和deallocated实例之间的区别时有些困难。

在 Objective-c 中,众所周知,向 nil 对象发送消息不会对程序流产生任何影响。

但是,向解除分配的对象发送消息会导致向解除分配的实例发送消息错误。

在我的理想世界中,释放的实例是“nil”,但显然不是。

确切的问题是:

  • 对象被释放后会发生什么?
  • 如果对象被释放,不应该释放它,然后变成nil吗?

【问题讨论】:

  • "对象被释放后会发生什么?" - 没有。当某些东西被释放时,它就不再存在了。 “如果对象被释放,不应该被释放,然后变成nil吗?” - 它应该使用安全的语言。但它不在Objective-C中。 nil 与释放的对象无关。 nil 是一个占位符,表示“没有对象”。
  • 'it doesn't in objective-c' 是什么意思?如果没有释放,那还有什么?
  • 它被释放了。不过,它并没有自动设置为nil
  • 嗯,很高兴您能就该主题提供完整的答案。

标签: objective-c memory-management


【解决方案1】:

我认为问题在于你必须区分两件事:对象和指向这些对象的指针。

指针是可以为 nil 或不为 nil 的指针。对象是可以释放的。

所以通过 nil 指针发送消息是可以的。 Objective-C 运行时足够聪明,可以保持程序流程并只返回 0。但是如果从该指针指向的对象被释放,那么,你的程序有问题(你正在释放一个仍然有一些保留计数的实例)它应该会崩溃。

【讨论】:

  • 吹毛求疵:你可以用“Objective-C runtime”交换“Xcode”;)
  • @CouchDeveloper 这甚至不是吹毛求疵。当事物 X 是某种运行时操作时说“Xcode 做 X 事物”是完全错误的。 (Objective-C 开发问题通常与 Xcode 没有松散的关系。太糟糕了,Apple 没有做出必要的概念区分,并将 Xcode 宣传为“一刀切”的 IDE。因此,一些 大多数人将 IDE (Xcode) 与语言 (Objective-C) 与编译器 (clang) 与他们自己的 iOS/OS X 应用程序混淆。非常、非常危险和烦人。)
  • @H2CO3 今天是美好的一天 ;) 你说得对! Odrakir 已经修复了这个假通行证;)
【解决方案2】:
  1. 它释放分配的内存(解除分配)和资源。
  2. 不重要。如果您不再使用指针,则可以保持原样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2011-10-27
    相关资源
    最近更新 更多