我知道当使用(强)引用时,ARC使用引用计数和编译器插入的递增和递减操作.它在对象的最后一个引用组超出范围后清除内存.
我的问题包含有一个var:
var key = NSData?
如果没有值,则默认为nil.现在我分配它之后再将值重新分配给nil - key = NSData().这会从以前存在的内存中删除该数据吗?
任何有用的文章将不胜感激.
当你写作
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对象被释放.
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |