QF-OC의 KVC, KVO

6614 단어 VC
KVC:(Key Value Coding) 키 값 인코딩
KVC란 set과 get 방법으로 대상 속성에 접근하지 않고 속성 이름 문자열을 통해 동적으로 속성을 읽는 것입니다.KVC는 사실 OC 반사 메커니즘의 일종의 운용이기도 하다.
대상마다 KVC 능력이 있는 이유는 NSObject 클래스가 NSKeyValueCoding 프로토콜을 실현했기 때문이다.
속성 지정:setValue:속성 값 forKey:속성 이름
속성 읽기:valueForKey:속성 이름
KVC가 비교적 자주 사용하는 용도는 네트워크 요청 후 NSDictionary 데이터를 Model에 불러오는 것이다. 만약에 이전의 set 방법을 통해 값을 부여하는 것이 매우 번거롭다면 KVC 방식을 사용할 수 있다. 즉, 모델 대상이 setValuesForKeysWithDictionary: 방법을 호출할 수 있다.이렇게 간단하고 거칠지만, 매개 변수 dict의 키는 모델의 속성과 대응해야 한다는 것을 주의해야 한다.보통 다시 써야 돼요.
KVO: 키 값 수신
KVO의 실현은 NSObject 클래스가 NSKeyValueObserver 프로토콜을 실현했기 때문에 모든 클래스가 KVO 능력을 가진다.
우리가 대상의 어떤 속성에 민감할 때, 이 속성에 관찰자를 추가할 수 있으며, 대상의 이 속성 값이 바뀌면 리셋 방법을 터치할 수 있다.
그것의 본질은 관찰자 모델이다.(단, 관찰자와 리셋 방법을 추가하는 것은 모두 자신의 방식이고 관찰자 모델과 다르다)
KVO는 일반적으로 데이터 모델 값이 변경되면 UI 인터페이스에 새 값이 표시됩니다.모델에 관찰을 추가하고 값이 바뀔 때 리셋 방법을 터치합니다: UI의 UIlabel 내용을 바꿉니다.
KVO 구현 단계:
    1.객체의 등록 정보에 관찰자(모니터)를 등록하려면 다음과 같이 하십시오.
    2.리셋 방법 다시 쓰기 (속성이 바뀔 때 터치)
    3.dealloc 방법을 다시 써서 관찰자를 없애세요.
KVO와 알림센터의 본질은 모두 관찰 모델이지만 KVO는 어떠한 대상의 속성도 관찰할 수 있다.그러나 알림 센터는 시스템이 제공하는 것이고, 그것은 일례이다.
Person.h
 
#import <Foundation/Foundation.h>

#import "BankCard.h"



@interface Person : NSObject



@property(nonatomic,copy) NSString * name;

@property(nonatomic,retain)BankCard * card;



@end

 
Person.m
#import "Person.h"



@implementation Person



- (void)setCard:(BankCard *)card

{

    _card = card;

    [self.card addObserver:self forKeyPath:@"money" options:NSKeyValueObservingOptionNew context:nil];  // card money ( )

}



// observeValueForKeyPath 。 , money , 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    if([keyPath isEqualToString:@"money"])

    {

        NSLog(@" , %i",self.card.money);

    }

}





// dealloc , 。 

- (void)dealloc

{

    [self.card removeObserver:self forKeyPath:@"money"]; // 

}



@end

BankCard.h
#import <Foundation/Foundation.h>



@interface BankCard : NSObject



@property(nonatomic,assign) long cardID;

@property(nonatomic,assign) int money;



@end

BankCard.m
#import "BankCard.h"



@implementation BankCard







@end

main.m
#import <Foundation/Foundation.h>

#import "Person.h"

#import "BankCard.h"



int main(int argc, const char * argv[])

{



    @autoreleasepool {

        

        Person * person = [[Person alloc]init];

        BankCard * card = [[BankCard alloc]init];

        card.money = 1000;

        person.card = card;

        

        NSLog(@" ...");

        card.money = 0;

        

        

    }

    return 0;

}

 
Person류에서 카드 속성의 머니 항목을 위해 감청기를 등록했는데 은행 카드가 도난당하자 잔액을 찾았다.머니의 값이 바뀌었기 때문에 다시 쓰는 리셋 방법이 터치됩니다.
 
참조: 클릭하여 입장

좋은 웹페이지 즐겨찾기