- 执行时机制:比較高级的特性,纯C语言
- 实际上我们平时写的OC代码。都是转成C语言的执行时代码,执行时代码的效率更高,更直接
Person.h
@interface Person : NSObject
@property(nonatomic,assign)int age;
@end
main.m
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc]init];
p.age = 10;
}
return 0;
}
我们来窥探底层对我们的这两句代码做了什么事情:
int main(int argc, const char * argv[]) {
/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;
Person *p = ((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init"));
((void (*)(id, SEL, int))(void *)objc_msgSend)((id)p, sel_registerName("setAge:"), 10);
}
return 0;
}
- 可能这样看起来有点乱,我略微整理一下:
alloc,init底层就是这种:
id pp = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));
Person *p = objc_msgSend(pp, sel_registerName("init"));
事实上就是给Person这个类发送一个alloc消息,然后返回一个Person对象,再给Person这个对象,发送一个init消息。返回一个初始化完成的对象。
我们继续看:
objc_msgSend(p, sel_registerName("setAge:"), 10);
这里是给Person对象发送一个setAge:消息,參数是10.
那么我们在main中的代码,我们事实上也能够这么写:
#import "Person.h"
#import <objc/message.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc]init];
objc_msgSend(p, @selector(setAge:),20);
NSLog(@"%d",p.age);
// p.age = 10;
}
return 0;
}
然而,这个可能你们还不能看出执行时有什么优点。详细的执行时的优点,看我之前写的博客:给执行时加入属性
执行时的常见三种使用方法