swift - 扩展中的 UIEdgeInset 自定义初始值设定项抛出 EXC_BAD_ACCESS

标签 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 初始化程序。但是当自定义初始化程序运行时,会抛出一个错误:

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/

相关文章:

ios - RxSwift 跟踪多个 observables 事件

ios - swift - 如何强制应用程序在从后台返回后显示特定 View

swift - 无法从函数内更改全局变量

ios - 多行 UILabel 在自动 UITableViewCell 上无法正确显示

ios - 我可以将私有(private)变量传递给将通过 Storyboard 实例化的 UIViewController 吗?

ios - 将简单数组连接到嵌套数组逻辑困惑

swift - 从通讯录中获取 kABAddressCountryCodeKey

ios - Swift 中的向下钻取 TableView

swift - tableView.cellForRowAtIndexPath(indexPath) 返回 nil

ios - snapchat 如何调整图像大小?