2011-12-19 1 views
26

가 이전 ARC에, 내가 할 수있는 아크 setMyProperty를 재정의하려면 retain/release 키워드를 더 이상 사용할 수 없으므로 적절하고 정확합니까?목표 - C 읽기 전용 특성과 개인 세터 구현 나는 속성을 사용하여 읽기 전용 수 있지만,이 클래스 내에서 쓰기 가능하고 싶었 경우

// interface declaration: 
@property (nonatomic, strong, readonly) NSString *myProperty; 

// Setter override 
- (void)setMyProperty:(NSString *)newValue 
{ 
    if (myProperty != newValue) { 
     myProperty = newValue; 
    } 
} 

답변

62

네, 그 정도면 충분하지만 그렇게 많이 필요하지는 않습니다.

여기 옳은 일을 할 것입니다

- (void)setMyProperty:(NSString *)newValue 
{ 
     myProperty = newValue; 
} 

컴파일러를 할 수 있습니다.

다른 것은 있지만, 당신도 그럴 필요가 없습니까? 클래스 확장에서 실제로 @property 선언을 다시 지정할 수 있습니다.

@interface SomeClass : NSObject 
@property (nonatomic, readonly, strong) NSString *myProperty; 
@end 

@interface SomeClass() 
@property (nonatomic, readwrite, strong) NSString *myProperty; 
@end 

이렇게하면 합성해야하며 개인용 합성기가 합성되어 있어야합니다.

+1

감사 여호수아 - 매우 유용합니다! 나는 최후의 일을 혼란스럽게 만들었다. ARC의 속성 변경에 대한 내용은 http://tools.ietf.org/html/draft-pantos-http-live-streaming-08에서 볼 수 있습니다. 기본적으로 **는 @synthesize로 구현됩니다 ** ** ** 할당보다는 ** 강한 **. 어떤 경우에는 공개 API를보다 명확하게 만들기 위해 공용 인터페이스의 사용자가 내부적으로 (내부적으로) 속성이 중요하다는 것을 알아야하거나 신경 쓸 필요가 없으므로 (비 원자 적, 읽기 전용) ? 잘만되면 나는 여기에서 의미를 가진다. :) –

+0

그것은 객체 유형에 대해서만 강력합니다. 더 명백하게하기 위해 나는 여전히'strong','weak' 또는'assign'를 넣고 싶습니다. –

+0

실제로 강력한 것은 객체 유형에만 적용 가능하지만 공개 API (예 : 헤더 파일)가이 세부 정보를 게시해야하는지 여부에 대한 질문이 여전히 남아 있습니다. 그게 제가 물어 보는 진정한 요점입니다! –

6

당신은 인터페이스 확장에 readwrite 같은 속성을 재 선언 할 수 있습니다

@interface SomeClass() 
@property (nonatomic, strong, readwrite) NSString *myProperty; 
@end