編譯:$clang - rewrite -objc main.m
消息發送機制 Person *p = [[Person alloc] init];
import <objc/message.h>
//iOS5蘋果不建議使用底層方法,需要在Build Phases搜索msg設置
Person *p = [Person new];
objc_msgsend(p,@selector(run));
objc_msgsend(p,@selecor(eatFood:),@"fruit");
Class PersonClass = [Person class];
類方法:objc_msgsend(PersonClass, @selector(類方法),參數);
類也是特殊對象,等同[PersonClass performSelector:@selector(run)];
Runtime應用場景
- 歸檔/解檔:序列化/反序列化 object以鍵值對的形式保存成二進制文件
for(int i = 0, i < 屬性的個數, i++) {
[Coder encodeObject:屬性值 forKey:key];
}
//Ivar:runtime裏面Ivar代表屬性成員變量 unsigned int count = 0;
//im 中成員變量也可以拿到
//書 Objective_C 2.0 運行時系統編程指南
Ivar *ivars = Class_copyIvarList([Person class], & count); =
Ivar ivar = ivars[0]; const char *name = ivar_getName(ivar);
#import<objc/message.h>
//歸檔
- (void)encodeWithCoder:(NSCoder *)coder {
unsigned int count = 0;
Ivar *ivars = Class_copyIvarList([Person class], &count);
for (int i = 0; i < count; i++) {
Ivar *ivars = class_copyIvarList([Person Class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
[coder encodeObject:[self valueForKey:key] forKey:key];
}
free(ivars);
}
}
//解檔
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
unsigned int count = 0;
Ivar *ivars = Class_copyIvarList([Person class], &count);
for (int i = 0; i < count; i++) {
Ivar *ivars = class_copyIvarList([Person Class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [coder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
free(ivars);
}
}
}