나의 플랫폼/iOS

[iOS] initWithCoder unrecognized selector sent to instance

GsBOB 2017. 10. 17. 10:55

Model을 만들어 사용할 때 아래 와 같은 에러가 나올 경우,


[ModelVO initWithCoder:]: unrecognized selector sent to instance


한번 에러 나는 모델 소스가 아래와 같이 되어 있는지 확인 바란다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import Foundation
 
class ModelVO : NSObject {
 
    var num: Int
    var title: String
 
    init(qno: Int, question: String, answered: Int){
        self.num = qno
        self.title = question
        self.answered = answered
    }
    
    required init(coder aDecoder: NSCoder) {
        self.num = aDecoder.decodeInteger(forKey: "num")
        self.title = aDecoder.decodeObject(forKey: "title"as! String
    }
    
    func encodeWithCoder(_ aCoder: NSCoder!) {
        aCoder.encode(self.num, forKey: "num")
        aCoder.encode(self.question, forKey: "title")
    }
 
}
 
cs

위 소스에서 문제점은 encodedWithCoder 이다. 


NSCoding을 상속 받고, encode 함수를 오바라이딩 받습니다. 

그럼 소스가 아래와 같이 변경이 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import Foundation
 
class ModelVO : NSObject, NSCoding {
 
    var num: Int
    var title: String
 
    init(qno: Int, question: String, answered: Int){
        self.num = qno
        self.title = question
        self.answered = answered
    }
    
    required init(coder aDecoder: NSCoder) {
        self.num = aDecoder.decodeInteger(forKey: "num")
        self.title = aDecoder.decodeObject(forKey: "title"as! String
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.num, forKey: "num")
        aCoder.encode(self.title, forKey: "title")
    }
}
 
cs

아카이빙을 항상 NSObject 와 NSCoding을 함께 쓴다고 생각 하면 될 듯 하다.

참고하세요.