내가 얻은 UnsafeMutableRawPointer
에서 UnsafeMutablePointer
을 얻으려고에 EXC_BAD_ACCESS는 Unmanaged.passUnretained().toOpaque()
를 사용 : 모든 때까지 pointer
에 괜찮아 보인다 여기 UnsafeMutableRawPointer는 UnsafeMutablePointer <T>에 : pointee
class C { var foo = 42, bar = "bar" }
let c = C()
let rawPointer = Unmanaged.passUnretained(c).toOpaque()
let pointer = rawPointer.bindMemory(to: C.self, capacity: 1)
let pointee = pointer.pointee
print(pointee.foo) // EXC_BAD_ACCESS
나에게 이상한 보이는 일부 LLDB 출력의 나는 그것의
pointee
요청 :
(lldb) frame variable -L c
scalar: (memtest2.C) c = 0x0000000101d00030 {
0x0000000101d00040: foo = 42
0x0000000101d00048: bar = "bar"
}
(lldb) frame variable -L rawPointer
0x00000001005e2e08: (UnsafeMutableRawPointer) rawPointer = {
scalar: _rawValue = 0x0000000101d00030 {
0x0000000101d00040: foo = 42
0x0000000101d00048: bar = "bar"
}
}
(lldb) frame variable -L pointer
0x00000001005e2e10: (UnsafeMutablePointer<memtest2.C>) pointer = 0x0000000101d00030
(lldb) frame variable -L pointer._rawValue
scalar: (memtest2.C) pointer._rawValue = 0x0000000101d00030 {
0x0000000101d00040: foo = 42
0x0000000101d00048: bar = "bar"
}
(lldb) frame variable -L pointee
0x00000001005e2e18: (memtest2.C) pointee = 0x00000001005b65d8 {
0x00000001005b65e8: foo = 140736790071664
0x00000001005b65f0: bar = ""
}
나는 또한 assumingMemoryBound(to:)
, load(as:)
, 또는 단순히 시도했다 :
let pointer = UnsafePointer<C>(bitPattern: Int(bitPattern: rawPointer))!
print(pointer.pointee.foo) // EXC_BAD_ACCESS
하지만이 EXC_BAD_ACCESS 오류는 항상 발생합니다. 여기서 무슨 일이 일어나고있는거야?
'obj = 관리되지 않음 .fromOpaque (rawPointer) .takeUnretainedValue(); print (obj.foo)'를 시도하십시오. –
OOPer
@OOPer 제 최종 목표는'C' 인스턴스에 접근하는 것이 아니라 실제로 원시 타입으로부터 유효 타입의 포인터를 얻는 것입니다. – nyg
그렇다면 귀하의 _end-goal_을 (를) 이해할 수 없습니다. 어쨌든, 당신의 코드는'rawPointer'가'C' 인스턴스에 대한 참조에 대한 포인터 일 때만 작동합니다.'Unmanaged.passUnretained (c) .toOpaque()'는 그것을 만들지 않습니다. – OOPer