4

Apple의 KVC로 일부 테스트를하려고하지만 KVC를 통해 값을 변경할 때 어떤 이유로 KVO를 트리거 할 수 없습니다.값 변경시 KVO가 트리거되지 않음

나는 다음과 같은 코드를 가지고 : 당신이 정말, 정말 기본 코드는, 그래서 부끄럽다 것 볼 수 있습니다처럼

#import <Foundation/Foundation.h> 

@interface Character : NSObject 
{ 
    NSString *characterName; 
    NSInteger ownedClowCards; 
} 
@property (nonatomic, retain) NSString *characterName; 
@property (nonatomic, assign) NSInteger ownedClowCards; 
-(void)hasLostClowCard; 
-(void)hasGainedClowCard; 
@end 

@implementation Character 
@synthesize characterName; 
@synthesize ownedClowCards; 

-(void)hasLostClowCard 
{ 

} 

-(void)hasGainedClowCard 
{ 

} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSLog(@"Change"); 
} 

@end 

int main() 
{ 
    Character *sakura; 
    Character *shaoran; 

    //--------------------------------------------------------------------- 
    // Here begins the KVO section. 

    [sakura addObserver:sakura forKeyPath:@"ownedClowCards" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; 

    //Create and give the properties some values with KVC... 

    sakura = [[Character alloc] init]; 
    [sakura setValue:@"Sakura Kinomoto" forKey:@"characterName"]; 
    [sakura setValue:[NSNumber numberWithInt:20] forKey:@"ownedClowCards"]; 

    shaoran = [[Character alloc] init]; 
    [shaoran setValue:@"Li Shaoran" forKey:@"characterName"]; 
    [shaoran setValue:[NSNumber numberWithInt:21] forKey:@"ownedClowCards"]; 

    //Done! Now we are going to fetch the values using KVC. 

    NSString *mainCharacter = [sakura valueForKey:@"characterName"]; 
    NSNumber *mainCharCards = [sakura valueForKey:@"ownedClowCards"]; 

    NSString *rival = [shaoran valueForKey:@"characterName"]; 
    NSNumber *rivalCards = [shaoran valueForKey:@"ownedClowCards"]; 

    NSLog(@"%@ has %d Clow Cards", mainCharacter, [mainCharCards intValue]); 
    NSLog(@"%@ has %d Clow Cards", rival, [rivalCards intValue]); 

    [sakura setValue:[NSNumber numberWithInt:22] forKey:@"ownedClowCards"]; 
} 

난이 어떤 이유에서 동작하지 않습니다. 내가하려고하는 모든 것은 ownedClowCards가 변경되면 알림을받는 것입니다. 나는 관찰자들을 등록하고있다. 프로그램을 실행하면 프로그램이 끝나면 "변경됨"메시지가 표시됩니다. 하지만 절대로 그렇지 않습니다. 변경 내 프로그램에 결코 그래서 나는 observeValueForKeyPath : ofObject 가정합니다 : 변경 : 컨텍스트 : 호출되지 않습니다.

어떤 도움이 필요합니까?

답변

4

아직 존재하지 않는 개체에 관찰자를 추가합니다.

이것은 단순히 변수를 선언하지만 아직 실제로 할당하거나 초기화하지 않습니다.

관찰자로 등록하기 전에 sakura = [[Character alloc] init];으로 전화 해보십시오.

그리고 일반적으로 NSString 속성은 copy 플래그를 사용하지만 retain은 사용하지 않습니다. 그리고 메모리 관리 플래그 (assign)는 원시 타입 (NSInteger)의 경우에는 의미가 없습니다.

+0

* 자기 촬영 * 이것은 단지 3 시간의 수면을 취한 결과입니다. 무리 감사. –

+0

좋아, 내 어리 석음을 고친 후에는 효과가있다. 변경된 내용이 인쇄되었지만 바로 다음에이 메시지가 표시됩니다. Key value observer가 등록되어있는 동안 Character 클래스의 인스턴스 0x100108380이 할당 취소되었습니다. 관측 정보가 누출되어 다른 물체에 실수로 부착 될 수 있습니다. - 나는 내 물건을 완전히 파멸시키지 않기 때문에 얻지 못합니다. –

+0

Erm은 신경 쓰지 않습니다. 그냥 관찰자를 제거하여 이것을 고쳤습니다. 다른 코드 줄을 작성하기 전에 커피를 가져 가야합니다. 도움을 청합니다. –

4
[sakura addObserver:sakura forKeyPath:@"ownedClowCards" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; 

사쿠라를 초기화하기 전에 위 작업을 수행하고 있습니다. 물론 nil에 대한 변경을 관찰하기 위해 nil을 설정하면 아무 일도하지 않습니다.

관련 문제