2011-01-13 7 views
4

나는 조금 게으르다가 나에게 곰이 될지도 모른다. 내 상황이야. 나는 2 개의 비 원자 속성을 갖는 클래스를가집니다. 예를 들면 다음과 같습니다.@synthesized 속성을 사용자 정의 할 수 있습니까?

@property (nonatomic, retain) UITextField *dateField; 
@property (nonatomic, retain) NSDate *date; 

구현시 예상대로 합성합니다. 내가 원하는 것은 setter가 호출 될 때마다 dateField (dateField의 text 속성을 멋지게 형식화 된 날짜 버전으로 설정)에 대한 작업도 수행한다는 것입니다.

는 난 그냥 수동으로 수행하여 내 구현 날짜 세터을 무시할 수 실현 다음 : 난 아직도 목표 C가 유지/릴리스주기를 처리 할 수 ​​있지만, 할 수 있다면

- (void) setDate:(NSDate *)newDate { 
    if (date != newDate) { 
     [date release]; 
     date = [newDate retain]; 
     // my code to touch the dateField goes here 
    } 
} 

무엇 좋지 않을까 것은 retain/release/set이 발생한 후에 호출되는 커스텀 핸들러를 "등록"(보다 나은 용어가 부족한 경우) 할 수 있어야합니다. 내 짐작으로 그건 불가능합니다. 그래도 내 google-fu는이 문제에 대한 답을 찾지 못했습니다. 그래서 물어볼 것입니다.

답변

4

KVO (키/값 관측)는 이와 같은 작업을 수행 할 수 있지만 코드가 더 많아지고 읽기 나 쓰기가 쉽지 않습니다.

당신은 KVO에 익숙 할 수 있지만, 경우에 당신 (또는 다른 사람이) 아니다 : 당신의 init 기능, 당신은이 작업을 수행 할 것입니다 :

[self addObserver:self forKeyPath:@"date" options:0 context:NULL]; 

그런 다음 당신이 구현하는 것이 :

-(void)observeValueForKeyPath:(NSString*)keyPath 
        ofObject:(id)object 
         change:(NSDictionary*)change 
         context:(void*)context 
{ 
    if (object == self && [keyPath isEqualToString:@"date"]) { 
     // code to touch the dateField goes here 
    } 
} 

마지막으로, dealloc, 당신은이 작업을 수행 할 것입니다 :

[self removeObserver:self forKeyPath:@"date"]; 

보시다시피, 그것은 더 많은 코드이며, 이해하기가 더 어렵습니다. 게으르다는 목표를 가진 사람에게는별로 효과적이지 않습니다. 그러나 KVO는 Objective-C의 주요 "데이터 바인딩"기능입니다. 훨씬 적은 코드로 데이터 바인딩을 수행 할 수있는 플랫폼 (예 : Flex)이 있지만 Objective-C에서는 많은 작업이 필요합니다. 방법이 아니라 큰 문제가 있지만 보여준 샘플 코드에 의해

는 버그 - 그것은 아마 다음과 같아야합니다

- (void) setDate:(NSDate *)newDate { 
    if (date != newDate) { 
     [date release]; 
     date = [newDate retain]; 
     // my code to touch the dateField goes here 
    } 
} 
+0

오른쪽, 그래서 관련 질문은 하나가 @synthesize는 다양한 상황에서 무엇을하는지에 대한 샘플 코드를 찾을 수있는 곳입니다 : 당신은 이상적으로 다른 이름으로) 명백한 이름을 사용하여 속성, 비공개 문서로해야 , 할당, 원자 등) –

+0

멋진, 대답 주셔서 감사합니다. 이론 상으로는 KVO에 대해 알고 있지만 예제를 얻는 것이 좋습니다. setter 코드의 버그를 지적 해 주셔서 감사합니다. 나는 그것을 실제로 사용하지 않고 (분명히) 그것을 썼다. 제 질문을 편집하여 다른 사람들을 오도하지 마십시오. –

+0

나는 눈이 멀어야한다 ... 코드에서 무엇을 수정 했습니까? 오 .. 질문이 수정 되었어야합니다. – Schultz9999

0

당신이 개인 바르/속성을 생성함으로써 달성 할 수있다 (OK (유지

@property (nonatomic, retain) UITextField *dateField; 
@property (nonatomic, retain) NSDate *date; // interface only 
@property (nonatomic, retain) NSDate *datePRIVATE; // the real ivar. 
... 
@synthesize datePRIVATE; 
- (void)setDate:(NSDate *)newDate { 
    self.datePRIVATE = newDate; 
    [self.dateField updateDisplayedDate:self.datePRIVATE]; 
} 
관련 문제