2019年8月29日木曜日

Xcode10.2以降にアップデート後にクラッシュ「This coder requires that replaced objects be returned from initWithCoder」が発生した時の対応方法


こんにちは、オフィス狛 モバイル開発担当 Aika-yuy です。
今回の投稿は、 Xcode10.2以降にアップデートした後にクラッシュする機能があったので、
解決方法を備忘録として残しておこうと思います。

・発生した事象

・Xcode10.1で作られていたアプリがあり、改修を行う事になったのですが、Xcodeのアップデータがあったので、10.2へアップデートした。
・ビルドは問題なく通ったが、一部の機能を実行すると、アプリが落ちるようになった。

という事で、修正前のコードです。こちらを実行したところ落ちてしまい下記のエラーが出ました。

 public init(_ coder: NSCoder? = nil) {
        if let coder = coder {
            super.init(coder: coder)!
        }
}
public override init(frame:CGRect) {
        super.init(frame:frame)
        self.initialize()
}

Terminating app due to uncaught exception 'NSGenericException', reason: 'This coder requires that replaced objects be returned from initWithCoder

・前提条件

・Objective-CとSwiftでは、呼び出し時の型が違う。
・型を合わせる為に、「@objc」を付ける

・エラーになる理由

Xcode10.2になって、コンパイラーの仕様が変更され、 今まで@objc推論が行われていたが、行われなくなったのでエラーになってしまったようです。

・対応方法

「@objc」が自動で付かなくなったので、必要ならば明示的に付けないと、Objective-CからSwiftをCallする時に落ちてしまいます。
該当する箇所を修正しました。
@objc public init(_ coder: NSCoder? = nil) {
        if let coder = coder {
            super.init(coder: coder)!
        }
}
@objc public override init(frame:CGRect) {
        super.init(frame:frame)
        self.initialize()
}

@objcをつけることで、使用することができました。


, ,

0 件のコメント:

コメントを投稿