[12]KVO的取值以及[self class] 和 [super class]

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]已经等价了。

你可能感兴趣的:([12]KVO的取值以及[self class] 和 [super class])