在Swift 2中使用UnsafeMutablePointer和CFRunLoopObserverContext

庆阮

我有以下代码

private func addRunLoopObserverForSaving() {
    var _self = self

    withUnsafeMutablePointer(&_self) { (pSelf) -> Void in
        var observerContext = CFRunLoopObserverContext(
            version: 0,
            info: pSelf,
            retain: nil,
            release: nil,
            copyDescription: nil)

        withUnsafeMutablePointer(&observerContext, { (pObserverContext) -> Void in

            let observer = CFRunLoopObserverCreate(
                kCFAllocatorDefault,
                CFRunLoopActivity.BeforeTimers.rawValue,
                true,
                0,
                { (observer, activity, context) -> Void in
                    guard context != nil else { return }

                    let pObserverContext = UnsafeMutablePointer<CFRunLoopObserverContext>(context)
                    let pGraphsModel = UnsafeMutablePointer<GraphsModel>(pObserverContext.memory.info)

                    let z = pGraphsModel.memory
                    ...
                },
                pObserverContext
            )

            CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode)
        })
    }
}

由于某些原因,linez = pGraphsModel.memory总是给我一个EXC_BAD_ACCESS我不确定UnsafeMutablePointer在检索存储值时是否使用正确。任何想法表示赞赏!

PS。这发生在XCode 7 beta5上。

庆阮

我自己进行了修复,结果context在回调中实际上是观察者上下文的info成员。因此,而不是:

let pObserverContext = UnsafeMutablePointer<CFRunLoopObserverContext>(context)
let pGraphsModel = UnsafeMutablePointer<GraphsModel>(pObserverContext.memory.info)

let z = pGraphsModel.memory
...

应该只是

let pGraphsModel = UnsafeMutablePointer<GraphsModel>(context)

let z = pGraphsModel.memory
...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章