다음 단위 테스트는 일부 UnsafePointer가 다른 것과 동일하므로 항상 실패합니다. 이 동작은 적어도 3 개의 문자열을 관찰합니다. High Sierra 버전 10.13.1 (17B48)에서 Xcode 버전 9.1 (9B55)을 사용하고 있습니다.UnsafePointer <Int8> 작동하지 않습니다.
func testUnsafePointer() {
let a = "aaa"
let b = "bbb"
let c = "ccc"
let ua = UnsafePointer<Int8>(a)
let ub = UnsafePointer<Int8>(b)
let uc = UnsafePointer<Int8>(c)
print("a: '\(a)', ua: '\(ua)'")
print("b: '\(b)', ub: '\(ub)'")
print("c: '\(c)', uc: '\(uc)'")
XCTAssertTrue(ua != ub)
XCTAssertTrue(ub != uc)
XCTAssertTrue(uc != ua)
}
인쇄물이
a: 'aaa', ua: '0x000060c000056a30'
b: 'bbb', ub: '0x00006080000530d0'
c: 'ccc', uc: '0x00006080000530d0'
NB 비슷합니다. 신속한 놀이터에서 모든 것이 괜찮아 보입니다.
let ua = UnsafePointer<Int8>(a)
에서
'UnsafePointer가 (a) '거의 확실 케이 당신이 생각하는대로하지 마라. Swift는 null로 끝나는 주어진 문자열의 UTF-8 바이트를 가진 새로운 버퍼를 만든 다음, 그 버퍼에 대한 포인터를 준다. 버퍼가 호출이 끝난 후에 할당 해제되므로 매달린 포인터가 남아있게됩니다. 따라서 동일한 값을 공유하는 포인터에 대해서는 의문의 여지가 없습니다. 하지만 포인터가 매달 렸기 때문에 역 참조를 시도하는 것은 정의되지 않은 동작입니다. 당신이 여기에서하려고하는 것은 무엇이든 거의 확실하게 그것에 대해가는 올바른 방법이 아닙니다. –
Hamish
@Hamish 이것은 행동을 설명합니다. 내가 의도 한 바는 바로이 문자열을 C 함수에 전달하는 것이다 : void cfunc (const char * a, const char * b, const char * c). 그러나이 cfunc에서 첫 번째 문자열은 괜찮습니다. 다른 문자열은 가비지입니다. UnsafePointer 변환으로이 함수를 호출합니다. – swift616
@ swift616 :'cfunc (a, b, c)'를 호출하면 컴파일러는 자동으로 변환에 필요한 코드를 생성합니다. –