gpt4 book ai didi

pointers - Swift 使用 UnsafePointer 从 UnsafeMutablePointer 获取值

转载 作者:搜寻专家 更新时间:2023-10-30 22:10:51 28 4
gpt4 key购买 nike

我正在尝试通过 contextInfo类型 UnsafeMutablePointer<Void>UISaveVideoAtPathToSavedPhotosAlbum并在回调函数中使用它。由于某种原因,我无法访问 contextInfo作为字符串使用 UnsafePointer<String>(x).memory当我在回调函数中时。

我很确定这是我所缺少的简单东西,但我花了很多时间试图弄清楚。

下面是我试过的一些代码。

以下代码有效。

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已经被释放。

Is there any way to force the retaining of a variable that has been created in a function? Then release it later?

这并非不可能,但我不知道这是最好的方法。

无论如何,使用 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是不可能的。因为Stringstruct并分配在堆栈内存中。也许它的缓冲区分配在堆中,但我们不能直接访问它。

关于pointers - Swift 使用 UnsafePointer<String> 从 UnsafeMutablePointer<Void> 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26776662/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com