iOS中的runtime应用
2016-07-05 00:00
295 查看
###iOS中的runtime应用
runtime是一套底层的C语言API,包含很多强大实用的C语言数据类型和C语言函数,平时我们编写的OC代码,底层都是基于runtime实现的。
###runtime有什么作用?
1.能动态产生一个类,一个成员变量,一个方法
2.能动态修改一个类,一个成员变量,一个方法
3.能动态删除一个类,一个成员变量,一个方法
###常用的头文件
####常用方法
######NSObject 的方法可以从 Runtime 系统中获取信息
-class方法返回对象的类;
-isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);
-respondsToSelector: 检查对象能否响应指定的消息;
-conformsToProtocol:检查对象是否实现了指定协议类的方法;
-methodForSelector: 返回指定方法实现的地址。
######运行时方法
-objc_msgSend : 给对象发送消息
class_addMethod(Class cls, SEL name, IMP imp, const char *types) :
给类添加方法
方法对应的C函数
给类添加属性
获取类名
获取类的所有方法
获取一个类的所有属性 class_copyPropertyList 注意:在使用完毕之后必须free()
获取类的所有成员变量 class_copyIvarList 注意:在使用完毕之后必须free()
获取方法实现
交换两个方法的实现
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()
相关文章推荐
- ios开发 强制横屏的实现
- 李洪强iOS开发之OC[009] -OC无参方法的声明实现和调用
- CCNA:路由器交换机IOS密码配置和4种模式简介
- iOS开发-二维码扫描和应用跳转
- 第三方支付
- iOS 缓存处理及理解
- ios 对于常用的NSUserDefults的封装
- iOS使用Workspace来管理多项目
- iOS开发:调用指纹传感器
- cocoapods安装第三方框架失败.
- iOS开发:唯一标志符
- iOS--一个简单的提示条代码
- [iOS]Xcode+GitHub远程代码托管(GIT, SVN)
- [iOS]Xcode处理过时方法的警告
- IOS常用宏定义
- iOS开发71-解决调试时Could not find Developer Disk Image问题
- 2.3 nagios 配置邮件告警
- 2.2 nagios 监控客户端
- 2.1 nagios 安装
- iOS滑动返回的最简单实现