2009-05-18 2 views
5

는 유지 특성을 가진 클래스의 다음과 같은 정의를 감안할 때 : 왜이 속성에는 '보유'가 필요합니까?

@interface FeedEntry : NSObject<NSCoding> 
{ 
    NSURL* url; 
    NSData* source; 
} 

@property (retain) NSURL* url; 
@property (retain) NSData* source; 
@end 

@implementation FeedEntry 

@synthesize url; 
@synthesize source; 

-(void)encodeWithCoder:(NSCoder*)coder 
{ 
    [coder encodeObject:url  forKey:@"url"]; 
    [coder encodeObject:source forKey:@"source"]; 
} 

가 왜 "유지"initWithCoder 방법의 url 속성이 필요 않습니다

-(id)initWithCoder:(NSCoder*)coder 
{ 
    url = [[coder decodeObjectForKey:@"url"] retain]; 
    source = [coder decodeObjectForKey:@"source"]; 

    NSLog(@"got url=%@\n", url); 
    return self; 
} 

특히, 왜 합성하지 않습니다 " get url "메소드는 객체를 유지합니까? (나는 소스 속성이 유지를 필요로 함을 추측하고있다.)

답변

16

빠른 대답 :

사용자가 설정 :

url = [[coder decodeObjectForKey:@"url"] retain]; 

당신이 @property를 사용 하지 있습니다. 인스턴스 변수 url의 값을 수동으로 설정하고 있습니다. 따라서 수동으로 값인 retain도 입력해야합니다.

[self setUrl:[coder decodeObjectForKey:@"url"]]; 

또는

self.url = [coder decodeObjectForKey:@"url"]; 

이러한 양식 중 하나를

이 합성 방법의 사용을 만들 것, 자동으로 retain을 처리 :

가 합성 된 속성을 사용하여 변수를 설정하려면, 대신 부를 것이다 .

세부 사항 :에서

목표 - C의 @property@synthesize 키워드가 자동으로 당신을 위해 getter와 setter 메소드를 만들 수는 :

@interface MyClass 
{ 
    id someValue; 
} 
- (id)someValue; 
- (void)setSomeValue:(id)newValue; 
@end 

@implementation MyClass 
- (id)someValue { return someValue; } 
- (void)setSomeValue:(id)newValue 
{ 
    [newValue retain]; 
    [someValue release]; 
    someValue = newValue; 
} 
@end 

:

@interface MyClass 
{ 
    id someValue; 
} 
@property (retain) id someValue; 
@end 

@implementation MyClass 
@synthesize someValue; 
@end 

에 동일 이것은 "내부"멤버 변수와 "내부"멤버 변수 사이에 중요한 차이를 만듭니다. 동일한 이름을 가진 속성. 멤버 변수를 이름으로 참조하면 합성 된 속성 메서드를 건너 뜁니다.

+0

실제로! 나는 이것이 나를 꽤 자주 물릴 것 같은 느낌이 든다. 답장을 보내 주셔서 감사합니다. – Justicle

+0

내 기쁨. 처음에는 익숙해 져야합니다. 일단 잠시 그것을 해왔다면 두 번째 성격이됩니다 :) –

+4

개인 인스턴스 변수에 _ 접두사를 사용하는 이유 중 하나이기 때문에 인스턴스 변수를 사용할 때 매우 쉽게 알 수 있습니다 다른 건요? –

관련 문제