2010-03-22 5 views
1
NSString *statusValue; 
NSString *currentValue; 

@property(retain, nonatomic) NSString *statusValue; 
@property(retain, nonatomic) NSString *currentValue; 

@synthesize statusValue; 
@sythnesize currentValue; 

을 감안할 때 위, 내가 ...@property, setter 및 getter question?

[self setStatusValue: currentValue]; 

을 일을해야 다른 하나 개의 변수를 설정하고 또는 내가 ... 다시 속성을 사용하고 사용하는 경우는

[self setStatusValue: [self currentValue]]; 

후자 (아마도 과장)는 독자에게 우리가 객체 인스턴스 변수 중 하나를 사용하고 일부 지역 변수는 사용하지 않는다고 말합니다. 정말

그냥 궁금해서, 나는 아래 하나 가고 있지만, 누군가가 내 코드 바라 보았다 전에 확인하고 싶었 "도대체 무엇을":

게리는

+0

'[self currentValue]'는 인스턴스 변수를 참조하지 않아도됩니다. 당신이 정말로 아는 것은 그것이 메시지를 보내는 것입니다. 이 메소드는 속성의 getter ('@ property' 또는 기타) 일 수도 있고 그렇지 않을 수도 있습니다. 그럴 경우 속성은 인스턴스 변수로 뒷받침되거나 그렇지 않을 수 있습니다. 아마도 그 이름대로가는 일종의 재산 일 것이고 그것은 그것이 정말로 중요합니다. 인스턴스 변수가 액세스하는 데 신경 쓰는 것이라면 직접 액세스 할 수 있습니다. 'c'세계에서 –

답변

3

둘 다 잘 작동합니다. 어느 것이 당신이 원하는 부작용에 따라 달라질 수 있습니다. 예를 들어, [self currentValue]을 사용하면 하위 클래스 인 경우에만 willAccessValueForKey:didAccessValueForKey: KVO 알림을 실제로 켤 수 있습니다. 대개 부작용이 없습니다.

개인적으로 저는 후자의 예제를 사용합니다. 변경하기로 결정한 경우 30 개 장소에서 iVar의 이름을 변경하는 것에 대해 걱정할 필요가 없습니다. (물론 Refactor-> Rename 도구는 그 상황에서 사용할 수있는 권리이지만 여전히 그렇습니다).

0

이 작동하고 이상인 경우 한 표현형 IMO :

self.statusValue = currentValue;

+0

, 예; obj-c 세계에서, 아니. – KevinDTimm

+1

Objective-C 2.0 현재'self.statusValue = currentValue;'는'[self setStatusValue : currentValue];에 대한 구문 적 설탕이며 "도트 구문"이라고도합니다. –

2

필자는 강력하지 않은 이유가 없으면 후자를 사용합니다. 그렇게하면 오버라이드 된 접근 자, 변경된 구현 등을 변경하지 않고 작동합니다. 예를 들어, statusValue를 문자열로 저장하지 않고 대신 statusValue와 함께 Status 객체를 저장하도록 결정할 수 있습니다. 만약 내가 직접 ivar에 접근한다면, 나는 그것들 모두를 변경해야만한다. 대신 클래스의 공용 인터페이스를 통해 갈 경우 한 접근 자 메서드 만 변경하면됩니다.

관련 문제