3

オブジェクトを 16 進文字列にシリアル化する次の拡張機能を検討してください。NSDataNSData

extension NSData {
    func base16EncodedString(uppercase uppercase: Bool = false) -> String {
        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count: self.length)
        let hexFormat = uppercase ? "X" : "x"
        let formatString = "%02\(hexFormat)"
        let bytesAsHexStrings = buffer.map {
            String(format: formatString, $0)
        }
        return bytesAsHexStrings.joinWithSeparator("")
    }
}

が非所有ポインターである場合、UnsafeBufferPointer明示的に破棄を呼び出す必要がない (またはできない) ことを意味しますか? UnsafePointerオブジェクトのバイトのメモリからを作成している場合NSData、バッファがコピーされた後にそのポインタを確実に破棄する必要がありますか?

4

1 に答える 1

4

UnsafePointer(self.bytes)UnsafePointer<Void>からへのポインター変換のみですUnsafePointer<UInt8>(C の「キャスト」のように)。メモリを割り当てません。

メモリはNSDataオブジェクトによって管理されます。あなたはalloc()メモリを持っていないのでdealloc()、ポインタを呼び出してはいけません。あなたもinitialize()記憶を持っていなかったので、それをしてはいけません destroy()

于 2016-07-26T15:16:26.627 に答える