swift如何处理内存中的nil值

Dav*_*iga 6 ios swift

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

我的问题包含有一个var:

var key = NSData?

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

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

Luc*_*tti 9

当你写作

var key = NSData?
Run Code Online (Sandbox Code Playgroud)

key变量被创建到堆栈中,并nil为其分配一个值.

让我们说接下来你将一个对象分配给key

key = NSData()
Run Code Online (Sandbox Code Playgroud)

现在,NSData在Heap中创建了一个类型的对象.并将该对象的地址写入key变量(进入堆栈).ARC还注意到,现在refereneCountNSData对象的值为1,因为它由1个变量引用.

现在我们再次分配nil给密钥

key = nil
Run Code Online (Sandbox Code Playgroud)

然后ARC检测NSData到不再引用进入堆的生活.因此它referenceCount降为0并且ARC将其从内存中删除(或者可能将Heap的区域标记为可以再次使用的可用内存).

什么时候对象被解除分配?

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

以下示例确实显示了它

在此输入图像描述

正如你所看到的"end"打印确实发生之前,Person对象被释放.