【发布时间】:2014-11-29 03:31:49
【问题描述】:
更新:问题和标题已根据针对最初问题所做的更改进行了重述。
我有一个基类,它实现了用于创建新实例的通用类方法。该类方法的简化逻辑如下
class MyBaseClass {
required init(_ record:MyRecordType) {
println("Entered MyBaseClass.init")
// Initialize base class from record
}
class func retrieveInstance<T:MyBaseClass>(name:String, callback:(T) -> ()) {
let myRecord:MyRecordType = ... // Perform fetch to get a record for name
let result = (T.self as T.Type)(myRecord) // Code currently crashes with BAD_ACCESS at this line
callback(result)
}
}
然后我用如下逻辑实现这个基类的子类
class MySubClass : MyBaseClass {
required init(_ record:MyRecordType) {
println("Entered MySubClass.init")
// Initialize subclass from record
super.init(record)
}
}
接下来,我尝试调用泛型类方法
class AnotherClass {
func successCallback(result:MySubclass) {
// Handle callback
}
MySubClass.retrieveInstance("objectName", callback:successCallback)
}
在创建类的实例时 - 标有注释的行标识了崩溃位置 - 我期待调用来自 MySubClass 的 init 方法。 (这个奇怪的符号是基于回复中建议的错误解决方法)
此代码没有为MySubClass 调用init 方法,而是因BAD_ACCESS 而崩溃。我找不到任何 nil 引用或任何其他可以解释此崩溃的内容。
【问题讨论】:
-
我无法重现 BAD_ACCESS。我假设您正在使用一些异步调用,也许问题就在那里。
-
@rintaro - 我终于能够隔离问题了。事实证明它与异步无关,而是涉及将重写的初始化程序与所需的初始化程序混合(我将在下面发布完整描述)。由于您的回答至少让我指出了正确的方向,所以我想在这里给您正确的答案,但您似乎已经删除了您的答案。如果您希望我感谢您的帮助,请随时重新发布。