2

我目前是我的 Swift 应用程序上传任务的owncloud iOS 库。它是用 Objective-C 编写的,需要我传递一个AutoreleasingUnsafeMutablePointer<NSProgress?>上传方法

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

let progress: NSProgress? = NSProgress()

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

我尝试了以下方式:

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

但我得到一个

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

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

4

2 回答 2

5

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

var pointer = AutoreleasingUnsafeMutablePointer<NSProgress>.init()
pointer.memory = progress!
于 2016-05-02T06:58:04.527 回答
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)
    }
}

就我而言,我进行了Key-Value Observing,因为我使用了第三方 Objective C 依赖项。请注意,您必须将dynamic关键字放在要使用 KVO 观察的对象的前面。

如果你仍然得到一个

EXC_BAD_ACCESS

例外,使用单例模式

于 2016-05-23T09:30:30.617 回答