【问题标题】:How to get the AutoreleasingUnsafeMutablePointer of a Swift Object如何获取 Swift 对象的 AutoreleasingUnsafeMutablePointer
【发布时间】:2016-05-02 06:24:13
【问题描述】:

我目前是我的 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)

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

【问题讨论】:

    标签: ios swift swift2 owncloud unsafemutablepointer


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,当我尝试你的代码时,我仍然遇到一个致命错误:让进度:NSProgress? = NSProgress(); var progressPointer = AutoreleasingUnsafeMutablePointer.init(); progressPointer.memory = 进度!;我不得不将指针中的 NSProgress 类型更改为 Optional,因为库需要这个。
    【解决方案2】:

    实际上有两个问题。

    我们可以像这样创建一个AutoreleasingUnsafeMutablePointer&lt;NSProgress?&gt; 对象:

    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

    例外,使用单例模式

    【讨论】:

      猜你喜欢
      • 2017-03-26
      • 2021-12-15
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      相关资源
      最近更新 更多