2015-08-08 145 views
4

使用UnsafeMutablePointer和CFRunLoopObserverContext我有代码斯威夫特2

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) 
     }) 
    } 
} 

下位对于一些原因,行z = pGraphsModel.memory总是给我一个EXC_BAD_ACCESS。我不确定在检索存储值时是否正确使用UnsafeMutablePointer。任何想法都很感激!

PS。这发生在XCode 7 beta5上。

回答

2

固定它我自己,原来在回调中的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 
...