1.初识runtime###
Runtime 运行时 用于对于APP流畅度数据加载效率要求较高的App,是一个运行时库(Runtime Library),使用的是C语言、汇编语言进行编写。通过Runtime机制,为C语言添加了面向对象的特性,得到我们使用的Objective-C语言。
2.runtime简单用法###
(1)函数调用:消息机制####
消息机制 —>
接受体:对象
消息:函数
[objc method];
翻译成 —>
objc_msgSend( objc, @selector( method ) );
objc代表的是本类self
objc_msgSend( objc, methodlist) //methodlist指向本类super objc_msgSend( super_objc, methodlist ) //Methodlist指向父类,super_objc本质也指向objc
例如:
OC写法:
[self createUI];
runtime写法:
objc_msgSend(self, @selector(createUI));
再如:
OC写法:
[self startRequestWithURL:@"http://www.baidu.com"];
runtime 写法
objc_msgSend(self, @selector(startRequestWithURL:),@"http://www.baidu.com");
注意:使用runtime需要导入头文件
#import <objc/runtime.h>
#import <objc/message.h>
2.动态的关联属性####
runtime可以进行,与动态扩展有关的还有类别
但是类别只能功能扩展,无法扩展属性
可以对属性扩展的有:
1、静态属性
2、使用运行时扩展属性(关联)
实现属性的关联(在类别中扩展):
1、在类别里创建一个静态的指针(key)
static void * v_key;
2、实现相应的getter、setter方法
@property id myValue;
—>
- (void)setMyValue:(id)objc{objc_setAssociatedObject(self, v_key, myValue, OBJC_ASSOCIATION_RETAIN);}
-(id)myValue{objc_getAssociatedObject(self, v_key);
}
例如:
定义一个类别NSString+MyCategary 在其中对NSString 进行属性扩展,定义一个属性name,类型为NSString,当操作时会产生错误
[__NSCFConstantString setName:]: unrecognized selector sent to instance 0x10a6670d0
因此需要对name的getter和setter方法进行扩展,扩展方法为
static void * key = @"key";
- (void)setName:(NSString *)name{
// self.name = name;//OC写法
/*
参数说明:
1.调用的对象self
2.静态的C语言指针,保证set/get方法操作的是同一个对象
3.赋予的值
4.赋值的变量属性修饰符
*/
objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString*)name{
// return self.name;//OC写法
return objc_getAssociatedObject(self, key);
}
当然这些知识初识runtime用法,更多信息后续补充。。。