您的位置:首页 > 移动开发 > IOS开发

iOS中的runtime应用

2016-07-05 00:00 295 查看
###iOS中的runtime应用
runtime是一套底层的C语言API,包含很多强大实用的C语言数据类型和C语言函数,平时我们编写的OC代码,底层都是基于runtime实现的。
###runtime有什么作用?
1.能动态产生一个类,一个成员变量,一个方法
2.能动态修改一个类,一个成员变量,一个方法
3.能动态删除一个类,一个成员变量,一个方法

###常用的头文件
#import <objc/runtime.h> 包含对类、成员变量、属性、方法的操作


#import <objc/message.h> 包含消息机制


####常用方法
######NSObject 的方法可以从 Runtime 系统中获取信息

-class方法返回对象的类;

-isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);

-respondsToSelector: 检查对象能否响应指定的消息;

-conformsToProtocol:检查对象是否实现了指定协议类的方法;

-methodForSelector: 返回指定方法实现的地址。

######运行时方法

-objc_msgSend : 给对象发送消息

class_addMethod(Class cls, SEL name, IMP imp, const char *types) :

给类添加方法

ClassOne *one = [ClassOne new];


class_addMethod([ClassOne class],@selector(testClassOneWithArg1:arg2:arg3:), (IMP)testClassOne , "i@:@@@");


[one testClassOneWithArg1:@"arg1" arg2:@"arg2" arg3:@"arg3"];


方法对应的C函数

int testClassOne(id self,SEL _cmd, NSString *arg1,NSString *arg2,NSString *arg3){


NSLog(@"this is a test function add to ClassOne as a methad with arg1:%@ arg2:%@ and arg3:%@",arg1,arg2,arg3);


return 10;

}


给类添加属性

ClassOne *one = [ClassOne new];


objc_setAssociatedObject(one, "objTag", @"value", OBJC_ASSOCIATION_COPY);


NSString *value = objc_getAssociatedObject(one, "objTag");


NSLog(@"通过Associate设置:%@",value);


获取类名

ClassOne *one = [ClassOne new];


const char *className = object_getClassName(one);


NSLog(@"className:%@",[NSString stringWithUTF8String:className]);


获取类的所有方法

UInt count;


Method *methods = class_copyMethodList([ClassOne class], &count);


for (int i = 0; i < count; i++) {


Method method = methods[i];


`SEL sel = method_getName(method);`

NSLog(@"方法名:%@",NSStringFromSelector(sel));

}


获取一个类的所有属性 class_copyPropertyList 注意:在使用完毕之后必须free()

uint propertyCount;


objc_property_t *ps = class_copyPropertyList([ClassOne class], &propertyCount);


for (uint i = 0; i < propertyCount; i++) {


`objc_property_t property = ps[i];`

const char *propertyName = property_getName(property);// 获取属性名


const char *propertyAttributes = property_getAttributes(property);


NSLog(@"propertyName:%@",[NSString stringWithUTF8String:propertyName]);


`NSLog(@"propertyAttributes:%@",[NSString stringWithUTF8String:propertyAttributes]);`

}

free(ps)


获取类的所有成员变量 class_copyIvarList 注意:在使用完毕之后必须free()

uint ivarCount;

Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount);


for (uint i = 0; i < ivarCount; i++) {


`Ivar ivar = ivars[i];`
`const char *ivarName = ivar_getName(ivar);//获取成员变量名字`
const char *type = ivar_getTypeEncoding(ivar);
`NSLog(@"ivarName:%@",[NSString stringWithUTF8String:ivarName]);`

}

free(ivars)


获取方法实现

Method class_getInstanceMethod(Class aClass, SEL aSelector)

class_getClassMethod()


//返回aClass的名为aSelector的方法


交换两个方法的实现

method_exchangeImplementations()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: