我知道 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 指出的那样,对象不会立即从内存中释放。它实际上是在自动释放池耗尽时释放的。
下面的例子确实说明了这一点
如您所见,“end”
打印确实发生在 Person
对象被释放之前。
关于ios - swift如何处理内存中的nil值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37753328/