KVO의 원리, 밑바닥 실현
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 분석:
좋아하는 원숭이 친구들 좋아요!!!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.