2010-11-24 1 views
26

objective-c 속성이 있습니다. 내가 필요한 것은 변수에 쓰기 전용 속성을 할당하는 것인데, 정확히 읽기 전용과 반대되는 것, 즉 변수에 setMethod이있을 수 있지만 getMethod이 없어야합니다. 나는 그것을하는 방법을 모른다. 일부 코드 스 니펫의 답변이 만족 스럽습니다.Objective-C에 속성 만 쓰기

+2

쓰기 전용 속성은 무엇을 사용합니까? IMHO 그것은 단지 메모리 낭비입니다. – Eimantas

+20

많이 사용합니다. 일반적으로 뭔가를 공개적으로 쓰기 전용으로하고 내부적으로 클래스에 쓰기를 원하면 읽기 전용입니다. – bbum

+0

외부 클래스가 전달해야하는 변수를 알고 있지만 현재 설정되어있는 변수를 알 수있는 이유가 없습니다. – ArtOfWarfare

답변

11
당신이 뭔가를 할 수

:

@interface MyClass { 
@private 
int _var; 
} 

- (void)setVar:(int)newVar; 
@end 

@implementation MyClass 
- (void)setVar:(int)newVar { 
_var = newVar; 
} 
@end 

지금 당신은 쓰기 전용입니다 속성과 같은 변수 var에 액세스 할 수 있습니다 : 당신이 가짜 속성을 읽으려고하면

@implementation SomeOtherClass 
... 
MyClass c = [[MyClass alloc] init]; 
c.var = 3; 
... 
@end 

을 그리고를 컴파일러가 경고합니다.

+1

구현과 인터페이스에서'- (void) setVar : (int) newVar' 메서드를 정의해야합니다. – JeremyP

+0

이 값을 완전히 숨기지는 않습니다. accessInstanceVariablesDirectly를 NO로 겹쳐 쓰지 않는 한, valueForKey : @ "var"로 값을 가져올 수 있습니다. 그리고 이것을 재정의하더라도 object_getInstanceVariable과 같은 objC-runtime 메서드를 사용하여 값을 얻을 수 있습니다. –

+4

그것은 재산이 아니다 – kubbing

5

재산이 필요한 이유가 있습니까? 세터를 메서드로 선언하고 일반 [foo setVar:bar] 구문을 사용합니다.

+5

또는 도트 구문을 사용하십시오 ...'foo.var = bar; '는 여전히 작동합니다. – bbum

+0

예, 작동하지만 입력 할 때 xCode가 자동 완성 var로 보이지 않습니다. –

+0

@FredrikJohansson 당신 말이 맞아요. 자동 완성 친화적 인 솔루션을 원한다면 내 솔루션을 확인해보십시오. –

44

또 다른 유효한 접근 방법은 누군가가 게터 액세스를 시도 할 경우 컴파일 타임 오류가 발생합니다

@interface MyClass 
@property NSString * var; 
- (NSString *)var UNAVAILABLE_ATTRIBUTE; 
@end 

이 사용할 수 없게 게터를 일반 속성을 선언하는 것입니다.


이 방법의 가장 큰 장점은 당신이 실제로 부동산 TM하지 암시 인스턴스 변수와 세터에 의해 위조 대리를 가지고입니다 :

  • 당신
  • 과 같은 모든 런타임 기능이 class_getPropertyclass_copyPropertyList과 같이 예상대로 작동 할 때 자동 완료됩니다.

는 경우

(비 id 재산의 경우) 게터 구현 어쨌든 합성하고

NSString * string = [myObj performSelector:@selector(var)]; 

또는 NSInvocation를 사용하여 같은 것을 사용하여 호출 될 수 말했다 편집증 및 당신 정말 클라이언트가 getter를 호출하지 못하게하려는 경우, 자신의 구현을 제공하여 명시 적으로 예외를 throw 할 수 있습니다. 누군가가 심각하게 인스턴스 변수 함부로 변경하고자하는 경우 마지막주의가 유스 케이스 주어진 아마 쓸모가 있도록

@implementation MyClass 
- (int)var { 
    [NSException raise:NSInternalInconsistencyException 
       format:@"property is write-only"]; 
} 
@end 

어쨌든, 그들은 그것을 액세스 할 수 런타임을 사용할 수 있습니다. 컴파일 타임 오류는 당신이 정말로 찾고있는 것이다.

+0

LLVM에서 사용할 수 있습니까? – Mingming

+0

이것은 허용 된 대답이어야합니다. – braden