我有这个扩展名:
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)
知道为什么这段代码会导致运行时错误?
答案 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
,但为参数提供默认值。代码甚至无法编译。因此,即使您可以解决递归问题,尝试通过扩展执行相同操作也会导致问题。