这个编码器要求从initWithCoder返回被替换的对象:

时间:2018-04-04 14:46:59

标签: ios objective-c

我的应用程序在iOS 11.2上运行良好,但在iOS 11.3中崩溃了。我得到了例外

  

由于未捕获的异常'NSGenericException'而终止应用程序,原因:'此编码器要求从initWithCoder返回替换的对象

我有一个带有tableView的viewController,这个tableView有两个单元格,这个表视图无法在cellForRowAtIndexPath方法中加载一个单元格。

LPDiscoverFeedCell *cell = (LPDiscoverFeedCell *)[tableView dequeueReusableCellWithIdentifier:checkPortrait];

这是我得到这个的例外点。

3 个答案:

答案 0 :(得分:2)

将xcode从10.0更新为10.2.1后,我开始看到此崩溃

该问题出现在4.1.0版的“ InputMask”库中,并且该问题已在其4.1.1版中得到修复。我正在使用迦太基,因此,我要做的就是运行迦太基更新命令

有关已修复崩溃的提交的更多信息,请参见以下链接:

NSGenericException: This coder requires that replaced objects be returned from initWithCoder

答案 1 :(得分:0)

您是否注册了LPDiscoverFeedCell?如果没有,请试试这个,

选项1

[self.tableView registerClass:[LPDiscoverFeedCell class] forCellReuseIdentifier:@"checkPortrait"];

选项2

UINib *feedCell = [UINib nibWithNibName:@"LPDiscoverFeedCell" bundle:nil];
[self.tableView registerNib:feedCell forCellReuseIdentifier:@"checkPortrait"];

看看这是否能解决问题。

答案 2 :(得分:0)

Xcode 10.2更新了具有新功能的编译器:

“为了减少Swift元数据占用的大小,现在,在Swift中定义的便捷初始化程序正在调用Objective-C中定义的指定初始化程序时,才提前分配一个对象。在大多数情况下,这对您的应用程序,但是如果便捷的初始化程序是从Objective-C调用的,而又没有通过self.init委托给暴露给Objective-C的初始化程序,则释放alloc的初始分配而不会调用任何初始化程序。对于不希望发生任何对象替换的初始化程序用户而言,这是一个问题,例如initWithCoder :::如果调用initWithCoder:的Swift实现,则NSKeyedUnarchiver的实现可能会出现错误的行为:周期。 为避免这种情况,请确保不支持对象替换的便捷初始化程序始终委托给也暴露于Objective-C的初始化程序,这是因为它们是在Objective-C中定义的,或者因为它们被标记为@objc,或者因为它们覆盖了暴露给Objective-C的初始化程序,或者因为它们满足@objc协议的要求。 (46823518)” https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_release_notes/swift_5_release_notes_for_xcode_10_2?language=objc

我在Storyboard场景中使用了MyClass:

enter image description here

如果MyClass具有方便的init()来调用指定的初始化程序,则应使用@objc进行标记:

class MyClass: NSObject {
    override convenience init() {
        self.init(int: 42)
    }

    // Add @objc to stop crashes
    @objc init(int: Int) {
        super.init()
    }
}