1、为什么需要Runtime
- Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。
- 因此,编译器是不够的,我们还需要一个运行时系统(Runtime system)来处理编译后的代码。
- Runtime 基本是用 C 和汇编写的,由此可见苹果为了动态系统的高效而做出的努力。苹果和 GNU 各自维护一个开源的 Runtime 版本,这两个版本之间都在努力保持一致。
2、Runtime是什么
*Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。比如:
[receiver message];
底层运行时会被编译器转化为:
objc_msgSend(receiver, selector)
如果其还有参数比如:
[receiver message:(id)arg...];
底层运行时会被编译器转化为:
objc_msgSend(receiver, selector, arg1, arg2, ...)
3、具体应用的场景有哪些?
3.1利用关联对象给分类关联属性,
//添加关联对象
void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)
//获取关联对象
id objc_getAssociatedObject(id object, const void * key)
//移除所有关联对象
void objc_removeAssociatedObjects(id object)
//实例
@interface NSObject (test)
@property (nonatomic, copy) NSString *name;
@end
.m文件
@implementation NSObject (test)
// 定义关联的key
static const char *key = "name";
-(NSString *)name
{
// 根据关联的key,获取关联的值。
return objc_getAssociatedObject(self, key);
}
-(void)setName:(NSString *)name
{
// 第一个参数:给哪个对象添加关联
// 第二个参数:关联的key,通过这个key获取
// 第三个参数:关联的value
// 第四个参数:关联的策略
objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
3.2查看私有成员变量
self.textField.placeholder = @"请输入用户名"
[self.textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];