【发布时间】:2016-06-10 17:06:35
【问题描述】:
是否可以手动从内存中清除对象的内容?
特别是,我正在处理NSData。我试过使用data.length = 0 和data.setData(NSData)。
我知道ARC 将在超出其所属范围后进行清理,但是否可以在我需要时手动强制执行此过程?
【问题讨论】:
标签: swift security automatic-ref-counting memory-safety
是否可以手动从内存中清除对象的内容?
特别是,我正在处理NSData。我试过使用data.length = 0 和data.setData(NSData)。
我知道ARC 将在超出其所属范围后进行清理,但是否可以在我需要时手动强制执行此过程?
【问题讨论】:
标签: swift security automatic-ref-counting memory-safety
我想你对 ARC 有一些误解,我想澄清一下。 ARC 的目标是确保不会发生内存泄漏。它负责在对象的生命周期内跟踪对象,并确保在没有对它的引用时“释放”它。
需要注意的是,被“释放”的内存并不意味着“用 0 覆盖它”。
这只是意味着内存将被指定为未使用。当系统需要为新对象分配内存时,释放的内存成为分配的候选对象。
但是,无法保证这种重新分配会发生,因此您释放的内存很有可能包含您的原始数据,并且永远不会被覆盖。
【讨论】:
.setdata(nsdata()) 之后,它也不能保证实际内存将被新值覆盖?或者你指的是什么时候你让物体完全离开?
setdata 方法,但很可能它会更新接收器的内部实例变量,该变量包含对 NSData 的引用。为其设置一个新值将使 ARC 释放它曾经引用的旧 NSData 对象(如果没有其他东西引用该 NSData 对象),但不能保证它会被清零。
setData(_:)。我相信resetBytesInRange(_:) 会做你想做的事。它将清零对象的敏感部分,ARC 稍后将释放它,并且在重新分配内存之前保持非敏感部分不变。