错误:执行中断,原因:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)
问题描述:
我有一个使用KVO功能的代码。错误:执行中断,原因:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
...
let oldRect = change?[NSKeyValueChangeOldKey] as! NSRect
所以,当我试图投价值的NSRect我收到错误:
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
和对象是的NSRect类型的对象:
(lldb) po change?[NSKeyValueChangeOldKey]
▿ Optional<AnyObject>
- Some : NSRect: {{293, 21}, {108, 108}}
答
如你所知, change
observeValueForKeyPath(_:ofObject:change:context:)
的参数类型为[String : AnyObject]?
,内部为NSDictionary
,它不能包含NSRange
作为值。
因此,KVO将该值转换为包含NSRange
的NSValue
。但不幸的是,它不能直接桥接到Swift中的NSRange
。
尝试这样:
let oldRect = (change?[NSKeyValueChangeOldKey] as! NSValue).rectValue