先来简单介绍一下runtime:
我们都知道Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。
对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行。这个运行时系统即Objc Runtime。Objc Runtime其实是一个Runtime库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。
我们编写OC代码时候,编译过程中首先会将OC语言转换成runtime(其实就是C语言) - - >然后再变成汇编 - - >最后成机器码。大概理解一下这个原理即可,下面上代码理解一下runtime的一些简单使用。
-
通过runtime获取一个对象的所有方法:
#import "objc/runtime.h" //得加入头文件unsigned int methCout_f =0; Method* methList_f = class_copyMethodList([test class],&methCout_f); for(int i=0;i<methCout_f;i++) { Method temp_f = methList_f[i]; IMP imp_f = method_getImplementation(temp_f); SEL name_f = method_getName(temp_f); const char* name_s =sel_getName(method_getName(temp_f)); int arguments = method_getNumberOfArguments(temp_f); const char* encoding =method_getTypeEncoding(temp_f); NSLog(@"方法名:%@,参数个数:%d,编码方式:%@",[NSString stringWithUTF8String:name_s], arguments, [NSString stringWithUTF8String:encoding]); } free(methList_f);
-
通过runtime获取一个对象的所有属性:
u_int count;
objc_property_t *properties = class_copyPropertyList([object class], &count);
NSMutableArray propertiesArray = [NSMutableArray array];
for (int i = 0; i < count ; i++)
{
const char propertyName = property_getName(properties[i]);
[propertiesArray addObject: [NSString stringWithUTF8String: propertyName]];
}free(properties); return propertiesArray;
-
关联对象改变获取值的方式
//设置一个全局静态指针,
static char * const associativekey = "associativekey";UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"what do you want to do?" delegate:self cancelButtonTitle:@"YES" otherButtonTitles:@"cancel", nil]; [alert show]; __weak typeof(self) weakSelf = self; void(^block)(NSInteger) = ^(NSInteger index){ [weakSelf youWantDoAnyThing]; NSLog(@"======%d",index); }; objc_setAssociatedObject(alert, associativekey, block, OBJC_ASSOCIATION_COPY); } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { void(^block1)(NSInteger) = objc_getAssociatedObject(alertView, associativekey); block1(buttonIndex); }
参考:http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/