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 如果没有关联对象,则返回 nilNSDate,然后强制转换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)

带有扩展的 Swift 核心数据

递归期间代码执行中断