我知道 ARC 使用引用计数,并在设置(强)引用时使用编译器插入的递增和递减操作。当对象的最后一个引用组超出范围后,它会清除内存。
我的问题包含有关 var 的问题:
var key = NSData?
如果不存在值,则默认为零。现在,在我分配它并将值重新分配为 nil 之后 -key = NSData()
。这会从内存中删除以前存在的数据吗?
任何有用的文章将不胜感激。
当你写的时候
var key = NSData?
The key
变量被创建到堆栈中并且nil
值被分配给它。
假设接下来你将一个对象分配给 key 所以
key = NSData()
现在是一个类型的对象NSData
被创建到堆中。并且该对象的地址被写入key
变量(进入堆栈)。
ARC 还注意到,现在refereneCount
NSData 对象的值为 1,因为它被 1 个变量引用。
现在我们再次分配nil
to key
key = nil
然后 ARC 检测到NSData
不再引用存在于堆中的内容。
所以就是referenceCount
下降到 0 并且 ARC 将其从内存中删除(或者可能将该堆区域标记为可以再次使用的空闲内存)。
对象到底什么时候被释放?
As @亚伦布拉格指出,该对象不会立即从内存中释放。当自动释放池耗尽时,它实际上被释放。
下面的例子确实表明了这一点
正如你所看到的"end"
打印确实发生了before the Person
对象被释放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)