我知道当使用(强)引用时,ARC使用引用计数和编译器插入的递增和递减操作。在对象的最后一个引用组超出范围后,它会清除内存。
我的问题包含var:
var key = NSData?
如果没有值,则默认为nil。现在,在我分配之后,将值重新分配给nil - key = NSData()
。这会从以前存在的内存中删除该数据吗?
任何有用的文章将不胜感激。
答案 0 :(得分:8)
写作时
var key = NSData?
将key
变量创建到堆栈中,并为其分配nil
值。
接下来我们说你将一个对象分配给键,所以
key = NSData()
现在,在堆中创建了类型为NSData
的对象。并且该对象的地址被写入key
变量(进入堆栈)。
ARC还注意到现在NSData对象的refereneCount
为1,因为它被1个变量引用。
现在我们再次将nil
分配给键
key = nil
然后ARC检测到不再引用居住在堆中的NSData
。
因此它的referenceCount
降为0并且ARC将其从内存中删除(或者可能将堆的区域标记为可以再次使用的可用内存)。
正如 @AaronBrager 指出的那样,该对象不会立即从内存中释放出来。实际上,当自动释放池耗尽时,它会被释放。
以下示例确实显示了它
正如您所看到"end"
打印确实发生之前 Person
对象已取消分配。