[英]Swift get value from UnsafeMutablePointer<Void> using UnsafePointer<String>
我試圖將類型為UnsafeMutablePointer<Void>
contextInfo
傳遞給UISaveVideoAtPathToSavedPhotosAlbum
並在回調函數中使用它。 出於某種原因,當我在回調函數中時,我無法使用UnsafePointer<String>(x).memory
將contextInfo
作為字符串訪問。
我很確定這是一件很簡單的事情,但我已經花了很多時間試圖解決這個問題。
下面是我嘗試過的一些代碼。
以下代碼有效。
var testStr:String = "hello"
takesAMutableVoidPointer(&testStr)
func takesAMutableVoidPointer(x: UnsafeMutablePointer<Void>){
var pStr:String = UnsafePointer<String>(x).memory
println("x = \(x)")
println("pStr = \(pStr)")
}
但是,以下代碼不起作用。
var testStr:String = "hello"
if UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(filePath){ //the filePath is compatible
println("Compatible")
//UISaveVideoAtPathToSavedPhotosAlbum(filePath, self, nil, nil)
UISaveVideoAtPathToSavedPhotosAlbum(filePath, self, "video:didFinishSavingWithError:contextInfo:", &testStr)
}
else{
println("Not Compatible")
}
func video(video: NSString, didFinishSavingWithError error:NSError, contextInfo:UnsafeMutablePointer<Void>){
var pStr:String = UnsafePointer<String>(contextInfo).memory
println("contextInfo = \(contextInfo)")
println("pStr = \(pStr)")
}
一旦我到達以下行:
var pStr:String = UnsafePointer<String>(contextInfo).memory
我一直收到以下錯誤:
Thread 1: EXC_BAD_ACCESS(code=1, address=0x0)
任何有關這方面的幫助將不勝感激。
謝謝。
更新
Rintaro評論說testStr需要是頂級的,但以下代碼可以正常工作。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var testStr:String = "hello"
takesAMutableVoidPointer(&testStr)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func takesAMutableVoidPointer(x: UnsafeMutablePointer<Void>){
var answer = UnsafePointer<String>(x).memory
println("x = \(x)")
println("answer = \(answer)")
}
}
我試圖不使用全局變量,除非我必須。 我可能不得不因為我能夠執行上面的代碼,似乎我不需要使用全局變量。
正如OP評論中所討論的那樣, testStr
已經被釋放。
有沒有辦法強制保留在函數中創建的變量? 然后稍后發布?
這不是不可能,但我不知道這是最好的方法。
無論如何,嘗試使用Playground或OS X“命令行工具”模板:
import Foundation
func foo() {
var str:NSString = "Hello World"
let ptr = UnsafePointer<Void>(Unmanaged<NSString>.passRetained(str).toOpaque())
bar(ptr)
}
func bar(v:UnsafePointer<Void>) {
let at = dispatch_time(
DISPATCH_TIME_NOW,
Int64(2.0 * Double(NSEC_PER_SEC))
)
dispatch_after(at, dispatch_get_main_queue()) {
baz(v)
}
}
func baz(v:UnsafePointer<Void>) {
println("notified")
let str = Unmanaged<NSString>.fromOpaque(COpaquePointer(v)).takeRetainedValue()
println("info: \(str)")
}
foo()
println("started")
dispatch_main()
Unmanaged<NSString>.passRetained(str)
增加保留計數。 Unmanaged<NSString>.fromOpaque(...).takeRetainedValue()
遞減它,並提取對象。 我認為,使用純 Swift String
是不可能的。 因為String
是struct
並且在堆棧內存中分配。 也許它的緩沖區是在堆中分配的,但我們無法直接訪問它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.