如何获取 Swift 对象的 AutoreleasingUnsafeMutablePointer

How to get the AutoreleasingUnsafeMutablePointer of a Swift Object

我目前是 owncloud iOS library 我的 Swift 应用的上传任务。 它是用 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 (code=1, address = 0x15942320)

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

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

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

实际上有 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)
    }
}

在我的例子中,我做了 Key-Value Observing,因为我使用的是第三方 Objective C 依赖项。注意你要使用KVO观察的对象前面要加上dynamic关键字

如果你仍然得到

EXC_BAD_ACCESS

异常,使用单例模式