美文网首页程序员iOS移动开发社区iOS
[程序员日记]初探Runtime 运行时

[程序员日记]初探Runtime 运行时

作者: KeyLiu7 | 来源:发表于2016-03-16 20:06 被阅读333次

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用法,更多信息后续补充。。。

相关文章

网友评论

    本文标题:[程序员日记]初探Runtime 运行时

    本文链接:https://www.haomeiwen.com/subject/jepqlttx.html