swift如何处理内存中的nil值

时间:2016-06-10 16:43:53

标签: ios swift

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

我的问题包含var:

var key = NSData?

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

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

1 个答案:

答案 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 指出的那样,该对象不会立即从内存中释放出来。实际上,当自动释放池耗尽时,它会被释放。

以下示例确实显示了它

enter image description here

正如您所看到"end"打印确实发生之前 Person对象已取消分配。