代码之家  ›  专栏  ›  技术社区  ›  John B.

Swift Extension异常执行中断,原因:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

  •  1
  • John B.  · 技术社区  · 8 年前

    我试图延长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)”

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  3
  •   Martin R    8 年前

    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合并运算符 ?? :

    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 仅用作内存地址 唯一标识关联对象。内容 静态属性及其类型无关,根本不使用。特别是,对象关联没有用该属性的值“初始化”。