Swift 扩展异常执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
Posted
技术标签:
【中文标题】Swift 扩展异常执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)【英文标题】:Swift Extension exception Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 【发布时间】:2016-06-26 19:17:28 【问题描述】:我尝试对 NSDate 进行扩展。我想要的是一个标志,指示是否必须稍后删除 NSDate
所以我在操场上试过这个
//: Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
extension NSDate
private struct RemovalInformation
static var removed: Bool = false
var removed: Bool
get
return (objc_getAssociatedObject(self, &RemovalInformation.removed) as! Bool)
set(newValue)
objc_setAssociatedObject(self, &RemovalInformation.removed, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
let date = NSDate()
print( "The Date is: \(date)")
if(date.removed == true)
print ("removed")
但是if(date.removed == true)
行产生了一个错误,我不知道如何处理:“EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”
【问题讨论】:
【参考方案1】:objc_getAssociatedObject
如果没有关联对象,则返回 nil
到NSDate
,然后强制转换as! Bool
崩溃。
(如果已设置关联对象,它也会崩溃,但它的
值不能转换为Bool
。)
您可以将属性设为可选:
var removed: Bool?
get
return objc_getAssociatedObject(self, &RemovalInformation.removed) as? Bool
set(newValue)
objc_setAssociatedObject(self, &RemovalInformation.removed, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
或提供默认值,例如使用 nil-coalescing 运算符 ??
:
var removed: Bool
get
return objc_getAssociatedObject(self, &RemovalInformation.removed) as? Bool ?? false
set(newValue)
objc_setAssociatedObject(self, &RemovalInformation.removed, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
注意&RemovalInformation.removed
只作为内存地址
唯一标识关联对象。那里面的内容
静态属性及其类型无关紧要,根本不使用。特别是,对象关联不会使用该属性的值“初始化”。
【讨论】:
谢谢哥们,你让我开心。我认为这可能是一件小事,但整个表达对我来说太新了,我完全可以理解。有了你提到的,我肯定对整个事情有了更多的了解。谢谢大佬。以上是关于Swift 扩展异常执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)的主要内容,如果未能解决你的问题,请参考以下文章
关于 Swift:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)
Swift JSONDecoder 解码错误:错误:执行被中断,原因:EXC_BAD_ACCESS (code=1, address=0x5e48)
错误:执行被中断,原因:断点 1.2。 Xcode 7.1,斯威夫特
快速添加:执行被中断,原因:EXC_BAD_INSTRUCTION (Code=EXC_l386_INVOP, subcode=0x0)