返回
iOS 探究 OC对象、isa指针及KVO实现原理
IOS
2023-11-11 12:07:19
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;
}
一点感悟
回顾之前学过的内容,发现有很多都已经忘记了。以前也没有写文章把学过的东西总结下来,现在回过头看,又要重新学习一遍。所以,以后一定要养成总结和记录的习惯,以便日后复习和查阅。