我有这个扩展:
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
初始化程序。但是当自定义初始化程序运行时,会抛出一个错误:
Thread 1: EXC_BAD_ACCESS (code=2, address=0x16f997ff8)
知道为什么这段代码会导致运行时错误吗?
最佳答案
您正在导致无限递归,因为您正在从其内部调用相同的 init
方法。
并且扩展真的不应该仅仅通过提供默认参数来尝试覆盖现有的 init
或其他方法。
已经有一个init(top:,left:,bottom:,right:)
。为另一个人提供相同的签名是个坏主意。
除此之外,您的主要问题是从同一 init
方法中调用 self.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
添加到类中,但为参数提供默认值。该代码甚至无法编译。因此,即使您可以解决递归问题,尝试通过扩展来做同样的事情只会导致问题。
关于swift - 扩展中的 UIEdgeInset 自定义初始值设定项抛出 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586035/