UIEdgeInset自定义初始化程序在扩展中抛出EXC_BAD_ACCESS

时间:2017-12-01 03:05:20

标签: swift

我有这个扩展名:

extension UIEdgeInsets {

    init(top: CGFloat = 0, left: CGFloat = 0, bottom: CGFloat = 0, right: CGFloat = 0) {
        self.init(top: top, left: left, bottom: bottom, right: right)
    }
}

扩展的目的是在UIEdgeInsets初始值设定项与默认值不同时,不必将参数传递给它们。但是当自定义初始化程序运行时,会抛出错误:

  

线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x16f997ff8)

知道为什么这段代码会导致运行时错误?

1 个答案:

答案 0 :(得分:1)

由于您从内部调用相同的init方法,因此导致无限递归。

扩展名真的不应该只是通过提供默认参数来覆盖现有的init或其他方法。

已经有init(top:,left:,bottom:,right:)。提供另一个具有相同签名的想法是个坏主意。

但是,除此之外,您的主要问题是在同一self.init方法中调用init

要查看问题,请添加print声明:

init(top: CGFloat = 0, left: CGFloat = 0, bottom: CGFloat = 0, right: CGFloat = 0) {
    print("Uh-oh")
    self.init(top: top, left: left, bottom: bottom, right: right)
}

作为另一个示例,创建一个带有init的类,该类带有一个参数。现在再次向该类添加相同的init,但为参数提供默认值。代码甚至无法编译。因此,即使您可以解决递归问题,尝试通过扩展执行相同操作也会导致问题。