如何获取Swift对象的AutoreleasingUnsafeMutablePointer

时间:2016-05-02 06:24:13

标签: ios swift swift2 owncloud unsafemutablepointer

我目前是我的Swift应用上传任务的owncloud iOS library。 它是用Objective-C编写的,要求我将AutoreleasingUnsafeMutablePointer<NSProgress?>传递给upload method

说我像这样创建一个新对象

let progress: NSProgress? = NSProgress()

如何在Swift中获取此对象的AutoreleasingUnsafeMutablePointer<NSProgress?>

我尝试了以下方式:

var progress: NSProgress? = NSProgress()
let unsafeAutoreleasingProgressPointer = AutoreleasingUnsafeMutablePointer<NSProgress?>.init(&progress)

但我得到了

  

EXC_BAD_ACCESS(代码= 1,地址= 0x15942320)

执行代码时。我想保留对progress对象的引用,因为我想添加一个观察者回调,它以百分比形式告诉我上传进度(如示例链接中所示)。

2 个答案:

答案 0 :(得分:5)

AutoreleasingUnsafeMutablePointer只是一个结构。您所要做的就是创建指针,然后将值赋给其memory属性。

var pointer = AutoreleasingUnsafeMutablePointer<NSProgress>.init()
pointer.memory = progress!

答案 1 :(得分:2)

实际上有2个问题。

我们可以像这样创建一个AutoreleasingUnsafeMutablePointer<NSProgress?>对象:

let progress = NSProgress()
let progressPointer = AutoreleasingUnsafeMutablePointer<NSProgress?>.init(&progress)

重要的是要注意你必须保持指针。如果在方法中创建指针,则只要退出方法范围,对它的引用就会丢失。这导致了

  

EXC_BAD_ACCESS

异常。所以你的实现可能如下所示:

class MyClass: NSObject {
    dynamic var progress: NSProgress = NSProgress()
    var progressPointer: AutoreleasingUnsafeMutablePointer<NSProgress?> = nil

    override init(){
        //...
        //init non optional variables here
        super.init()
        progressPointer = AutoreleasingUnsafeMutablePointer<NSProgress?>.init(&progress)
    }
}

在我的情况下,我做了键值观察,因为我使用的是第三方Objective C依赖项。请注意,您必须使用KVO将dynamic关键字放在要观察的对象前面。

如果你还有

  

EXC_BAD_ACCESS

例外,使用单例模式