ios - swift如何处理内存中的nil值

标签 ios swift

我知道 ARC 在设置(强)引用时使用引用计数和编译器插入的递增和递减操作。它会在对象的最后一个引用组超出范围后清除内存。

我的问题包含有一个 var:

var key = NSData?

如果没有值,默认情况下为 nil。现在,在我分配它并将值重新分配给 nil 之后 - key = NSData()。这会从内存中删除之前存在的数据吗?

任何有用的文章将不胜感激。

最佳答案

当你写作时

var key = NSData?

key 变量被创建到 Stack 中,并为其分配了一个 nil 值。

假设接下来您将一个对象分配给 key so

key = NSData()

现在,一个类型为 NSData 的对象被创建到堆中。并且该对象的地址被写入 key 变量(写入堆栈)。 ARC 还注意到现在 NSData 对象的 refereneCount 为 1,因为它被 1 个变量引用。

现在我们再次分配 nil 给 key

key = nil

然后 ARC 检测到堆中的 NSData 不再被引用。 因此它的 referenceCount 下降到 0 并且 ARC 将它从内存中删除(或者可能将该堆区域标记为可以再次使用的空闲内存)。

具体什么时候释放对象?

正如@AaronBrager 指出的那样,对象不会立即从内存中释放。它实际上是在自动释放池耗尽时释放的。

下面的例子确实说明了这一点

enter image description here

如您所见,“end” 打印确实发生在 Person 对象被释放之前。

关于ios - swift如何处理内存中的nil值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37753328/

相关文章:

swift - 关于如何使用捕获列表来避免引用循环的困惑

ios - UIScrollView setContentOffset 会给scrollview 添加 subview ?

iOS 以编程方式转到选项卡和推送 View Controller

ios - 无法从 Objective-C 通用框架引用 Swift 通用框架的类和方法

ios - 保存对象时从不正确的线程访问的 Realm

ios - 无法加载 'Charts' 的底层模块

ios - 从 NSKeyedUnarchiver.unarchiveObject 到 PropertyListDecoder().decode 的错误

swift - 从菜单打开窗口

ios - SpriteKit - 为什么我的弹跳球会穿过地面?

ios - 使用 Swift 按字母顺序对 TableView 单元格进行排序