와 @property로 나는 이런 식으로 뭔가 있다고 가정NSMutableArray를 읽기 전용
@property (readonly) NSMutableArray *someArray;
내가 수정할 수를 [OBJ someArray]를 @property가 읽기 전용으로 설정된 경우에도?
와 @property로 나는 이런 식으로 뭔가 있다고 가정NSMutableArray를 읽기 전용
@property (readonly) NSMutableArray *someArray;
내가 수정할 수를 [OBJ someArray]를 @property가 읽기 전용으로 설정된 경우에도?
예, 내용을 수정할 수 있습니다. 읽기 전용은 포인터 자체에만 적용됩니다. 즉, 이 아니라이 C++의 const
과 같습니다.
기본적으로 "읽기 전용"이란 단어는 "a.someArray = foo
을 "으로 번역하지 말라는 의미입니다. 즉, 세터가 생성되지 않습니다.
NSArray
을 사용하십시오.)
를 속성이 아니지만 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 복사본을 수행해야합니다.
"이것은 C++의 const의 의미와 다릅니다." "const"의 위치에 따라 달라집니다 – user102008
왜 @dynamics 구절을 쓰지 않는지 설명해 주시겠습니까? – docchang
@docchang 명시적일뿐입니다. '@dynamic'은 필수는 아니지만 미래의 독자들에게 합성을하기보다는 구현을 제공하고자하는 좋은 알림입니다. –
당신은 C의 "const"를 의미합니다. C에 관한 간단한 요점은 "const"가있는 별표의 어느쪽에 달려 있는지에 달려 있습니다. readonly 속성은 NSMutableArray * const someArray와 같습니다. const NSMutableArray * someArray와 같지 않습니다. http://en.wikipedia.org/wiki/Const-correctness –
@Matt - 좋은 지적. –