2009-03-21 7 views
4

와 @property로 나는 이런 식으로 뭔가 있다고 가정NSMutableArray를 읽기 전용

@property (readonly) NSMutableArray *someArray; 

내가 수정할 수를 [OBJ someArray]를 @property가 읽기 전용으로 설정된 경우에도?

답변

10

예, 내용을 수정할 수 있습니다. 읽기 전용은 포인터 자체에만 적용됩니다. 즉, 이 아니라이 C++의 const과 같습니다.

기본적으로 "읽기 전용"이란 단어는 "a.someArray = foo을 "으로 번역하지 말라는 의미입니다. 즉, 세터가 생성되지 않습니다.

(당신이 수정을 방지하기를 원한다면 물론, 당신은 단지 대신 NSArray을 사용하십시오.)

+2

당신은 C의 "const"를 의미합니다. C에 관한 간단한 요점은 "const"가있는 별표의 어느쪽에 달려 있는지에 달려 있습니다. readonly 속성은 NSMutableArray * const someArray와 같습니다. const NSMutableArray * someArray와 같지 않습니다. http://en.wikipedia.org/wiki/Const-correctness –

+0

@Matt - 좋은 지적. –

3

를 속성이 아니지만 someArray의 내용은 수정할 수 있습니다 (즉, 호출의 값을 변경할 수 없습니다 속성에 할당하여 someArray 인스턴스 변수). 이것은 C++의 const의 의미와는 다릅니다. 배열을 실제로 읽기 전용 (즉, 독자가 수정할 수 없음)으로하려면 배열을 사용자 정의 접근 자로 포장해야합니다. @interface에서

@property (readonly) NSArray *readOnlyArray; 

(당신의 someArray 속성을 가정)과 @implementation

@dynamic readOnlyArray; 

+ (NSSet*)keyPathsForValuesAffectingReadOnlyArray { 
    return [NSSet setWithObject:@"someArray"]; 
} 
- (NSArray*)readOnlyArray { 
    return [[[self someArray] copy] autorelease]; 
} 

참고 발신자는 여전히 배열에서 객체의 상태를 돌연변이 수있을 것입니다. 인 것을 방지하려면 삽입시 불변으로 만들거나 readOnlyArray 접근 자에 배열의 depp 복사본을 수행해야합니다.

+0

"이것은 C++의 const의 의미와 다릅니다." "const"의 위치에 따라 달라집니다 – user102008

+0

왜 @dynamics 구절을 쓰지 않는지 설명해 주시겠습니까? – docchang

+0

@docchang 명시적일뿐입니다. '@dynamic'은 필수는 아니지만 미래의 독자들에게 합성을하기보다는 구현을 제공하고자하는 좋은 알림입니다. –