[12]KVO的取值以及[self class] 和 [supe
2019-05-10 本文已影响0人
默然走一生
kvo取值的顺序:
self.demoView = [[DemoView alloc] init];
[self.demoView addObserver:self forKeyPath:@"demoTestStr" options:NSKeyValueObservingOptionNew context:nil];
[self.demoView setDemoTestStr:@"456"];
[self.demoView setValue:@"uuu" forKey:@"demoTestStr"];
只会字一个。只有注释了上面的 才会走下面的。
//先走这个
- (id)valueForKey:(NSString *)key
{
return @"valueForKey";
}
//然后取这个
- (id)valueForKeyPath:(NSString *)keyPath
{
return @"valueForKeyPath";
}
//取这个
- (NSString *)demoTestStr
{
return @"demoTestStr";
}
//最后取这个
- (id)valueForUndefinedKey:(NSString *)key
{
return @"valueForUndefinedKey";
}
如果设置了 NSString * _demoTestStr;
就不会崩溃了
1. 下面的代码分别输出什么?
@implementation Son : Father
- (id)init {
self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
答案:都输出”Son”
解释:objc中super是编译器标示符,并不像self一样是一个对象,遇到向super发的方法时会转译成objc_msgSendSuper(...),而参数中的对象还是self,于是从父类开始沿继承链寻找- class这个方法,最后在NSObject中找到(若无override),此时,[self class]和[super class]已经等价了。