在Objective c项目中初始化swift类会导致无限循环

时间:2015-08-19 00:59:27

标签: ios objective-c swift

我正在尝试在我的添加中添加颜色选择器,并使用此https://github.com/gizmosachin/ColorSlider库,该库仅使用swift编写,我使用objective-c。我已经按照本指南How to call Objective-C code from Swift了解了如何在objective-c项目中添加swift库。我99%肯定我已经正确配置了xcode,因为我可以导入swift库并运行我的应用程序而没有错误,只有当我尝试实例化应用程序崩溃的swift类时,我才会看到init方法swift类被无限调用。该库的源代码是一个文件,仅供参考(https://github.com/gizmosachin/ColorSlider/blob/master/Source/ColorSlider.swift

这是init方法之一(其他内容是覆盖)

// MARK: Initializers
convenience init() {
    println("hi there swift")
    self.init()
    backgroundColor = UIColor.clearColor()
}

在我的日志中,我看到“hi there swift”打印多次。这就是我启动swift类的方法

ColorSlider *colorSlider = [[ColorSlider alloc] init];

我知道包含上面代码行的函数只被调用一次,因为我使用NSLog(@“output”)来查看它显示的次数,输出看起来像这样

output
hi there swift
hi there swift
hi there swift
hi there swift
hi there swift
etc...to infinity or until app crashes

我是否正确地实例化了swift类?我不确定为什么swift类的init方法被无限调用

----的更新 -----

看起来下面的init方法也使用super.init? enter image description here

2 个答案:

答案 0 :(得分:2)

删除self.init。该方法自称。

答案 1 :(得分:2)

在Objective-C中,类可以具有便利(辅助)初始化器和指定(主要)初始化器。

代码执行的路径应该是:

  1. 便捷初始化程序应使用self.designatedInit()调用指定的初始值设定项。
  2. 指定的初始化程序应使用super.designatedInit()调用超级指定的初始化程序。
  3. 在您的代码中,init()是一个便利初始化程序(convenience init())。调用self.init()将导致无限循环,因为这是Dan本身实际运行的函数。

    如果您将其更改为super.init(),便捷初始化程序正在调用超级初始化程序,由于上述规则#1,这是非法的。

    怎么办?

    1. 检查init()是否真的是一个便利初始化器。
    2. 如果是,请拨打self.designatedInit()而不是self.init()
    3. 如果不是这样,请更改init()的分类并调用super.init()(或者超级类的指定初始化程序。