【问题标题】:What happens if we access object which is as NSZombie? [duplicate]如果我们访问作为 NSZombie 的对象会发生什么? [复制]
【发布时间】:2014-12-17 12:02:53
【问题描述】:

我们知道,当对象的保留计数达到 0 时,它就会变成 Zombie 对象。如果我们访问该对象会发生什么?

【问题讨论】:

  • 只有当你启用了僵尸才会变成僵尸

标签: ios objective-c


【解决方案1】:

如果 Zombies 被启用,那么当所有对它的引用都被删除时,该对象将不会被释放;而是会生成一条日志消息,以帮助您追踪此无效引用的来源。

【讨论】:

  • 感谢您的回答。我将检查日志消息。如果将该对象设置为零怎么办?僵尸对象还会在内存中吗?
  • 如果您没有打开 Zombies,则永远不会将引用设置为指向 Zombie 对象。然后引用继续指向被释放的对象。如果您使用 ARC,一个常见的问题是一个“弱”属性,在它指向的对象已被释放后才被访问。
  • 是的。它永远不会被释放!
  • @PeterSegerblom 不明白 ;) 我敢说这里不正确......关键是 nszombies 没有释放 - 弧与否
  • @Daij-Djan 确切地说,NSZombies 是一种用于追踪悬空指针的“调试工具”。在生产代码中没有为 NSZombies 设置任何内容,然后指针仅指向已释放回系统的内存位置。还是我错了?
【解决方案2】:
####       




               ** Message sent to deallocated instance 0xFFFFFFF **




####

虽然最初的答案是崩溃或未定义的行为,但这对于非调试版本完全正确,而不是在您调试应用时,因为它需要使用某些标志来激活 NSZombies。

实际上,僵尸本身并不存在。

保存对象的内存不会在释放时归零。该内存被内存管理器简单地标记为空闲,以后可以重用,并被其他对象或数据完全或部分覆盖。

因此,如果您在没有打开 NSZombies 的情况下访问死对象,您可以想象,您会遇到崩溃或未定义的行为,它甚至可能会工作一段时间。

NSZombies 调试技术通过将释放的内存替换为某种 Zombie 对象来帮助跟踪这一点,这些对象在您访问它们时会记录消息(通常不应该发生)。

p.s:讨厌的人会讨厌

【讨论】:

  • 没有。 nszombie 不是未定义的,恰恰相反。它只是不会被释放。访问 nszombie 很好
  • OK 是的,同意,NSZombie 是个例外。但是肯定要让对象变成僵尸,你必须设置调试标志。
  • 不 - 它只是记录一条消息
  • 该死的你也在这里。好的。采取 3
猜你喜欢
  • 2014-07-18
  • 1970-01-01
  • 2016-07-10
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2014-10-28
  • 1970-01-01
相关资源
最近更新 更多