2015-11-20 48 views
1

一個實例我編碼Int64(圖形卡上)配有一些情況下(即正確存儲在並保持由一些陣列)的unsafeAddressOf獲取從「unsafeAddressOf」

然後我想從我的Int64回到我的實例。我設法從我的Int64正確初始化UnsafePointer<MyClass>

然後,我做的:

let x = UnsafePointer<MyClass>.memory. 

但使用x崩潰。

我的理解是不安全的,棘手的考慮ARC。但是,仍然有什麼方法可以在Swift中實現呢,還是無奈?

謝謝。

+0

「我設法從我的Int64中正確初始化了一個UnsafePointer 。」告訴我們這部分代碼,請 – user3441734

回答

0

你所試圖做的是極不安全的,因爲你自己也說了,有可能更安全的方法來解決任何問題您正在使用的,但在這裏是做一個完整的例子:

func getPointer<T:AnyObject>(obj : T) -> Int64 
{ 
    return unsafeBitCast(unsafeAddressOf(obj), Int64.self) 
} 

func recoverObject<T:AnyObject>(ptr : Int64) -> T 
{ 
    return Unmanaged<T>.fromOpaque(COpaquePointer(bitPattern: Int(ptr))).takeUnretainedValue() 
} 

class C { 
    var cID = 0 
    func foo() { 
     print("Instance of C, id = \(cID)") 
    } 
} 

class D { 
    var dID = 0 
    func foo() { 
     print("Instance of D, id = \(dID)") 
    } 
} 


let c : C = C() 
let d : D = D() 

c.cID = 123; 
d.dID = 321; 

let cPtr : Int64 = getPointer(c) 
let dPtr : Int64 = getPointer(d) 

c.cID *= 10 

let c1 : C = recoverObject(cPtr) 
let d1 : D = recoverObject(dPtr) 

c1.foo() 
d1.foo() 

輸出是:

Instance of C, id = 1230 
Instance of D, id = 321 

感謝user3441734一些有用的提示!請注意泛型的使用。獲取「指針」和取消引用它的函數應該適用於任何類(儘管如此,它們不適用於結構體)。

至於這樣做的更安全的方式,答案將取決於你在做什麼的上下文。爲什麼不能在需要實例的地方訪問實例數組,而不是通過Int64s獲取實例?如果陣列實際上由第三方庫(Objective-)C代碼保持,則有可能出現的是,由於存儲器對準等另外的問題它可能會編寫C代碼,將返回實例SWIFT代碼在更安全的方式。

請讓我知道更多的細節,如果回答不出於某種原因。

0
class C { 
    func foo() { 
     print("C") 
    } 
} 
var c = C() 

let addr = unsafeAddressOf(c) 
dump(addr) 
/* 
▿ UnsafePointer(0x7F86E942B230) 
    - pointerValue: 140217415807536 
*/ 

let pC = withUnsafePointer(&c) { (p) -> UnsafePointer<C> in 
    return p 
} 

dump(pC) 
/* 
▿ UnsafePointer(0x10DE5B390) 
    - pointerValue: 4528124816 
*/ 

dump(pC.memory) 
/* 
- C#0 
*/ 
let opaquePointer = COpaquePointer(addr) 
let unmanagedC = Unmanaged<C>.fromOpaque(opaquePointer) 
dump(unmanagedC) 
/* 
▿ Swift.Unmanaged<C> 
- _value: C#0 
*/ 

// I still dont have an idea how to use it ... 

哈,我明白了!

unmanagedC.takeUnretainedValue().foo() // prints C ! 
+0

這樣的工作!你可以在apple dev論壇的這個答案中看到一些額外的細節:[link](https://forums.developer.apple.com/thread/26655) –