二十一世纪最贵的是什么? ————————————— 答案:人才or房子
本篇主要是各种Class相关方法的实现,还有两种运行时调用方法的实现
- (void)viewDidLoad {
[super viewDidLoad];
// 调用方法方案1
// objc_msgSend(self,@selector(initial:),@"完成初始化");
// 调用方法方案2
Method method = [self class_getInstanceMethod:SelfClass selector:@selector(initial:)];
[self method_invoke:self method:method];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - Initialize
- (void)initial:(NSString *)str{
if (str) NSLog(@"%@",str);
_person = [[Person alloc] init];
_person.name = @"xietao";
_person.age = @"18";
_person.gender = @"male";
_person.city = @"shanghai";
[self logRunTimeAction:nil];
}
#pragma mark - IBAction
- (IBAction)logRunTimeAction:(id)sender {
objc_property_attribute_t attrs[] = { { "T", "@\"NSString\"" }, { "&", "N" }, { "V", "" } };
size_t objSize = class_getInstanceSize([_person class]);
size_t allocSize = 2 * objSize;
uintptr_t ptr = (uintptr_t)calloc(allocSize, 1);
// Class
[self class_getClassName:SelfClass];
[self class_getSuperClass:SelfClass];
[self class_getInstanceSize:SelfClass];
[self class_getInstanceVariable:SelfClass name:"_person"];
[self class_getClassVariable:SelfClass name:"Person"];
[self class_getInstanceMethod:SelfClass selector:@selector(class_getInstanceMethod:selector:)];
[self.class class_getClassMethod:SelfClass selector:@selector(class_getClassMethod:selector:)];
[self class_getProperty:SelfClass name:"person"];
[self class_getMethodImplementation:SelfClass selector:@selector(class_getMethodImplementation:selector:)];
[self class_getMethodImplementation_stret:SelfClass selector:@selector(class_getMethodImplementation_stret:selector:)];
[self class_copyIvarList:[_person class]];
[self class_copyPropertyList:[_person class]];
[self class_copyMethodList:[_person class]];
[self class_copyProtocolList:[_person class]];
[self class_addIvar:[_person class] name:"country" size:sizeof(NSString *) alignment:0 types:"@"]; // 无效方法
[self class_addProperty:[_person class] name:"country" attributes:nil attributeCount:3];
[self class_addMethod:SelfClass selector:NSSelectorFromString(@"runtimeTestMethod:") imp:nil types:"v@:@"];
[self class_addProtocol:[_person class] protocol:@protocol(RuntimeBaseProtocol)];
[self class_replaceProperty:[_person class] name:"country" attributes:nil attributeCount:3];
[self class_replace