返回

iOS 探究 OC对象、isa指针及KVO实现原理

IOS

OC对象的本质

Objective-C对象是一种数据结构,它存储了对象的状态和行为。每个OC对象都有一个isa指针,它指向对象的类对象。类对象包含了该类的所有信息,包括对象的类型、对象的实例变量、对象的方法等。

OC实例对象、类对象、元类对象分析

OC中存在三种对象:实例对象、类对象和元类对象。实例对象是通过类对象创建的,类对象包含了实例对象的所有信息。元类对象是类对象的类对象,它包含了类对象的所有信息。

isa和superclass的分析

isa指针指向对象的类对象,superclass指针指向对象的父类对象。当对象调用方法时,系统会根据对象的isa指针找到该方法的实现。如果对象没有实现该方法,则系统会根据对象的superclass指针继续查找该方法的实现。

KVO实现原理

KVO是观察者模式的一种实现,它允许对象监视其他对象的变化。当被观察对象发生变化时,观察者对象会收到通知。KVO的实现原理是通过在被观察对象上添加一个KVO控制器,该控制器会监视被观察对象的属性变化,并在属性发生变化时通知观察者对象。

用代码实现一个KVO

@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end

@implementation Person
- (void)setName:(NSString *)name {
    [self willChangeValueForKey:@"name"];
    _name = name;
    [self didChangeValueForKey:@"name"];
}
@end

@interface Observer : NSObject
@property (nonatomic, weak) Person *person;
@end

@implementation Observer
- (instancetype)initWithPerson:(Person *)person {
    self = [super init];
    if (self) {
        _person = person;
        [_person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
    }
    return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSLog(@"%@ 的 %@ 改变了,现在是 %@", _person, keyPath, [change objectForKey:@"new"]);
}

- (void)dealloc {
    [_person removeObserver:self forKeyPath:@"name"];
}
@end

int main(int argc, char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        person.name = @"张三";
        Observer *observer = [[Observer alloc] initWithPerson:person];
        person.name = @"李四";
        person.name = @"王五";
        [person removeObserver:observer forKeyPath:@"name"];
        person.name = @"赵六";
    }
    return 0;
}

一点感悟

回顾之前学过的内容,发现有很多都已经忘记了。以前也没有写文章把学过的东西总结下来,现在回过头看,又要重新学习一遍。所以,以后一定要养成总结和记录的习惯,以便日后复习和查阅。