我目前是我的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对象的引用,因为我想添加一个观察者回调,它以百分比形式告诉我上传进度(如示例链接中所示)。
答案 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
例外,使用单例模式。