2017-10-11 4 views
0
let data = Data()  
    data.withUnsafeBytes { (uPtr: UnsafePointer<UInt8>) in 
     var ptr = uPtr 
     var j = ptr.pointee 
     var new = ptr.advanced(by: 1)  
    } 

여기서 j은 무엇을 나타내거나 저장합니까? 데이터의 다음 바이트 인 을 가리 킵니까? 새로운 변수가 다음 바이트를 저장합니까? 빠른 링크에서 간단한 방법으로 포인터를 배우기위한 모든 링크 신속한 방법으로 포인터를 사용하는 장점은 무엇입니까?pointee 속성은 신속하게 무엇을합니까?

답변

2

pointee은 포인터에 의해 저장되고 가리키는 값입니다. 이전 버전의 Swift에서는 memory이었습니다. 스위프트에 포인터를 사용하지 마십시오 당신이 절대적으로해야하지 않는 한, 그것을 유지 수동으로 메모리를 해제 당신을 포함하기 때문에 :

UnsafePointer는 자동화 된 메모리 관리 또는 정렬 보증을 제공하지 않습니다. 누출을 방지하기 위해 안전하지 않은 포인터 또는 정의되지 않은 동작을 통해 작업하는 모든 메모리의 수명주기를 처리해야합니다.

예를 들어 데이터가 없지만 데이터가있는 경우 첫 번째 포인터는 먼저 데이터 배열의 첫 번째 값인 메모리 주소를 가리 킵니다.

var str = "Hello, playground" 

guard let data = str.data(using: .utf8) else {fatalError()} 
data.withUnsafeBytes { (uPtr: UnsafePointer<UInt8>) in 
    let ptr = uPtr 
    ptr.pointee // 72 
    let ptr2 = ptr.advanced(by: 1) 
    ptr2.pointee // 101 
} 

그래서 여기에 우리가 ptr.pointee는 72 "H"의 UTF8의 값으로 기대하고 우리가 1 발전 할 때 우리는 101이다 "E", 즉 값에 대한 포인터를 가지고 우리는 Array를 통해 작업을하고 있습니다. 그러나 배열의 각 항목에 대한 메모리 주소가 인접하지 않을 수도 있다고 가정하기 때문에 실제로이 작업을 수행하고 싶지는 않을 것입니다. 것 바이트를 검색에

더 냉정한 접근 방식 : 더 나은 여전히 ​​

data.withUnsafeBytes { [UInt8](UnsafeBufferPointer(start:$0, count:data.count)) 
} 

이상이 :

[UInt8](data) 

this post에 설명 된대로.

관련 문제