2012-02-07 1 views
0

NSuserdefaults에 Objective C 기반 객체를 저장하려고합니다.NSuserDefaults에서 데이터를 보관 취소하는 올바른 방법은 무엇입니까?

NSuserDefaults에서 데이터를 검색하려면 initWithCoder 메서드를 사용합니다.

구현 한

- (id)initWithCoder:(NSCoder *)decoder { 

    self = [super init]; 
    if (self != nil){ 

     //decode properties, other class vars 
     self.variable = [decoder decodeObjectForKey:@"variable"]; 



    } 
    return self; 
} 

구현하는 올바른 방법은 2

- (id)initWithCoder:(NSCoder *)decoder { 

    self = [[CustomClass alloc] init]; 
    if (self != nil){ 

     //decode properties, other class vars 
     self.variable = [decoder decodeObjectForKey:@"variable"]; 



    } 
    return self; 
} 

:

나는이 두 가지 구현을 보았는가?

이 두 가지의 차이점은 무엇입니까?

답변

0

이것은 실제로 NSUserDefaults 구현의 차이가 아니라 클래스가 서브 클래스인지 여부에 따라 다릅니다. 서브 클래스는 슈퍼 클래스의 속성을 얻기 위해 [super init]을 호출합니다 (예 2). 그렇지 않으면 사용자 정의 클래스를 할당하고 초기화 할 수 있습니다 (예 1).

1

당신은 메소드에 객체를 할당해서는 안됩니다 (alloc은 init/initWithCoder가 호출되기 전에 발생합니다). 귀하의 코드는 다음과 같아야합니다 :

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super initWithCoder:decoder]; 
    if (self != nil){ 
     //decode properties, other class vars 
     self.variable = [decoder decodeObjectForKey:@"variable"]; 
    } 
    return self; 
} 
+0

initWithCoder는 NSCoding 프로토콜의 구성원입니다. NSObject는 NSCoding을 구현하지 않으므로 (자신의 클래스에 명시 적으로 선언해야 함) NSObject에서 직접 파생 된 클래스에서 [super initWithCoder : decorder]를 호출 할 수 없습니다. – interrupt