【问题标题】:How to deinit class object in swift? [duplicate]如何在swift中取消初始化类对象? [复制]
【发布时间】:2017-08-31 07:12:49
【问题描述】:

抱歉,我有一个关于内存管理的问题。
我创建了一个“用户”对象。
当我结束使用时,我想让它为零来租用内存。
我尝试过,但失败了。
我怎么了?

var user:User? = User(userId)
user?.fromJson(data["user"])
self.users[userId] = user
user?.updateDb()
user = nil

【问题讨论】:

  • “我失败了”是什么意思?你得到一个编译器错误还是什么?顺便提一句。你不需要关心 swift 中的内存管理,这种语言有一个垃圾收集器,如果你的代码不能再访问一个对象,它将释放内存。检查这个:developer.apple.com/library/content/documentation/Swift/…
  • @JohnnyAW 垃圾收集和 ARC 是两个完全不同的概念。
  • 您已将User 放入self.users 数组中;所以有一个对它的引用,并且在该引用消失之前它不会被释放。

标签: ios swift memory-management


【解决方案1】:

如果“用户”是引用类型

当你创建对象时,referenceCount 递增 1

当您通过“userId”在字典中设置用户时,referenceCount 增加 1

和referenceCount == 2

在 user = nil 之后,你删除了 1 个引用

referenceCount == 1

并保持 1 个强引用,对象不会被删除

【讨论】:

  • 如何查看引用计数
  • 核心基础有 C 函数,它返回 refCount "CFGetRetainCount(_ cf: CFTypeRef!) -> CFIndex" CFindex 是 Int 上的类型别名
【解决方案2】:

在大多数情况下,您不必担心取消初始化对象。 Swift 和它的前身 Objective-C 一样,使用自动引用计数 (ARC) 来跟踪哪些对象仍在使用中,哪些对象需要删除。简而言之,如果一个对象没有强引用,它会自动被释放。

在您的情况下,您定义了 user 局部变量。如果您不将对该变量的引用存储在其他地方,则在您离开声明它的范围后,它将立即被释放。

【讨论】:

  • 我只是好奇,这是一个与垃圾收集“完全不同的概念”吗?
  • @JohnnyAW ARC vs. GC
  • @ColGraff thx 链接,但这实际上表明,这是内存管理的相同 concept 的 2 个不同实现
  • @JohnnyAW 是的,它们都管理内存,但它们以非常不同的方式进行管理。垃圾收集更加彻底和自动,但通常比自动引用计数占用更多资源。它们是朝着同一个目标的不同概念。
  • @mag_zbc 理论上它甚至可以在作用域结束之前被释放,但这是一个实现细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2015-03-09
  • 1970-01-01
相关资源
最近更新 更多