2016-07-26 31 views
2

考慮this extensionNSData其中一個序列化對象NSData成十六進制字符串:我是否需要釋放UnsafeBufferPointer或緩衝區指針的起始內存位置處使用的UnsafePointer?

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是一個非擁有指針,這是否意味着我不需要(或我不能夠)明確調用銷燬?如果我從NSData對象的字節內存中創建UnsafePointer,我是否需要確保在複製緩衝區後銷燬該指針?

+0

比較http://stackoverflow.com/q/25605658/1187415:*「只有在指針引用的內存中存在非重要內容時才需要destroy(),如強引用或Swift結構或枚舉「。* - 從這個意義上講,'UInt8'是」微不足道的內容「,如果你打電話銷燬,這是無關緊要的。 –

+0

@MartinR謝謝。所以'UnsafePointer(self.bytes)'不會泄漏,因爲只要它超出範圍,它就會被釋放? – JAL

+3

'UnsafePointer(self.bytes)'只是從'UnsafePointer '到'UnsafePointer '的指針轉換(「cast」)。它不分配內存。內存由'NSData'對象管理。 –

回答

3

UnsafePointer(self.bytes)只是從UnsafePointer<Void>UnsafePointer<UInt8>(如C中的「cast」)的指針轉換。它不分配內存。

內存由NSData對象管理。你沒有alloc()的 內存,因此不能在指針上調用dealloc()。 你也沒有initialize()這個內存,所以一定不要 destroy()吧。

相關問題