KVO의 원리, 밑바닥 실현

2850 단어

1. 개념


KVO, 즉 Key-Value Observing, 키 값 관찰은 지정한 대상의 속성이 수정되면 대상이 알림을 받는 속성 변화를 감청하는 메커니즘을 제공합니다.쉽게 말하면 매번 지정된 관찰 대상의 속성이 수정되면 KVO는 수정 전후의 값을 가지고 상응하는 관찰자에게 자동으로 통지한다.

2. 방법

  • 관찰자 등록addObserver:forKeyPath:options:context:
  • 관찰자 실현observeValueForKeyPath:ofObject:change:context:
  • 관찰자 제거removeObserver:forKeyPath:
  • 3. 밑바닥 실현 검증


    ViewController 클래스에 3개의 속성(관찰용) 추가
    @interface ViewController : UIViewController
    @property (nonatomic, assign) int a;
    @property (nonatomic, assign) int b;
    @property (nonatomic, assign) int c;
    @end
    

    Appdelegate에서 인증
    @implementation AppDelegate
    
    //  
    + (NSArray*)classMethodList:(Class)class {
        NSMutableArray* array = [NSMutableArray array];
        unsigned int count = 0;
        Method* methodList = class_copyMethodList(class, &count);
        for(int i = 0; i < count; ++i) {
            SEL sel = method_getName(*(methodList+i));
            [array addObject:NSStringFromSelector(sel)];
        }
        free(methodList);
        return array;
    }
    
    //  
    + (NSString *)logInfo:(id)obj {
        NSString* string = [NSString stringWithFormat:@"\t%@
    \t : %@
    \t : %@
    \t : %@
    ", obj, [obj class], object_getClass(obj), [[self classMethodList:object_getClass(obj)] componentsJoinedByString:@" , "]]; return string; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ViewController *vc = [[ViewController alloc] init]; NSLog(@" :
    %@", [AppDelegate logInfo:vc]); [vc addObserver:vc forKeyPath:@"a" options:NSKeyValueObservingOptionNew context:nil]; NSLog(@" :
    %@", [AppDelegate logInfo:vc]); return YES; } @end

    인쇄 결과:
    2016-10-21 11:10:40.970662 KVO[912:277637] 관찰자를 추가하기 전: 표면의 종류: ViewController 실제 유형: ViewController 방법 목록: dealloc,didReceiveMemoryWarning,viewDidLoad,c,setcC:,a,b,setA:,set2016-10-21 11:10:40.971306 KVO[912:277637] 관찰자를 추가한 후: 표면의 실제 유형: ViewVController KontifyingViewController 메서드 목록:setA:,class,dealloc,isKVOA
    Log 분석:
  • KVO에 등록한 후에도 a의 표면 유형은 ViewController이지만 실행할 때의 유형은 NSKVONotifyingViewController, 시스템이 실행 중인 동안 ViewController의 하위 클래스를 만들었음을 알 수 있습니다(왜 하위 클래스인지 묻지 마세요) NSKVONotifyingViewController, a 객체의 isa 포인터를 NSKVONotifyingViewController.
  • KVO에 등록한 후에 setA:방법을 다시 썼는데 시스템은 이 방법에 속성 변경 전후의 값을 가지고 관찰자에게 알린다.
  • KVO에 등록한 후 setB:,setc: 방법은 다시 쓸 필요가 없습니다. 관찰되지 않았기 때문입니다.
  • KVO에 등록한 후class 방법을 다시 써서 ViewController 형식으로 되돌려 a대상의 실제 유형을 바꾸는 것을 더욱 은밀하게 한다.
  • KVO 등록 후 나타남isKVOA, 이 방법은 이것이 KVO에 등록한 후에 생성된 클래스인지 아닌지를 표시하는 데 사용될 것으로 추측됩니다.

  • 좋아하는 원숭이 친구들 좋아요!!!

    좋은 웹페이지 즐겨찾기