ARCでは、オブジェクトの強い参照のすべてをnil
に設定するだけで、オブジェクトの割り当てを解除できます。 UnsafePointer
またはUnsafeMutablePointer
でAutoreleasingUnsafeMutablePointerの割り当てを解除する必要がありますか?もしそうなら、どうですか?
、私は明示的にメモリを管理する必要があります。
let buffer = sizeof(Int8) * 4
var ptr = UnsafeMutablePointer<Void>.alloc(buffer)
defer {
ptr.destroy()
ptr.dealloc(someVal)
ptr = nil
}
しかし、ドキュメントがAutoreleasingUnsafeMutablePointer
オブジェクトに対して曖昧です。私はdestroy
またはdealloc
をAutoreleasingUnsafeMutablePointer
に明示的に呼び出すことはできません。
var ptr: AutoreleasingUnsafeMutablePointer<Void> = nil
defer {
ptr = nil
}
// assign something to ptr
名前は、それがスコープ外に落ちた後、それが自動解放されることを意味し、私はそれが自動解放されるためにはAutoreleasingUnsafeMutablePointer
nil
に設定する必要がありますか?
ここでは、AutoreleasingUnsafeMutablePointer
を使用して、ランタイムによって現在ロードされているすべてのクラスのリストを取得する例を示します。 Objective-Cランタイムのパワーを呼び出すときに、いくつかの機能だけではなく、UnsafeMutablePointer
AutoreleasingUnsafeMutablePointer
を必要とすることに注意してください:
var numClasses: Int32 = 0
var allClasses: AutoreleasingUnsafeMutablePointer<AnyClass?> = nil
defer {
allClasses = nil // is this required?
}
numClasses = objc_getClassList(nil, 0)
if numClasses > 0 {
var ptr = UnsafeMutablePointer<AnyClass>.alloc(Int(numClasses))
defer {
ptr.destroy()
ptr.dealloc(Int(numClasses))
ptr = nil
}
allClasses = AutoreleasingUnsafeMutablePointer<AnyClass?>.init(ptr)
numClasses = objc_getClassList(allClasses, numClasses)
for i in 0 ..< numClasses {
if let currentClass: AnyClass = allClasses[Int(i)] {
print("\(currentClass)")
}
}
}
残念ながら私は答えを持っていないが、それはスコープの外に落ちたとき、それが処理されなかった場合、私は驚くだろう。 –