码迷,mamicode.com
首页 > 其他好文 > 详细

Runtime初学习

时间:2016-08-03 00:00:07      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:

什么是runtime?

runtime是一套纯c的API.平时用oc写的代码在运行时都会先转成runtime代码,然后在执行。

runtime可以干什么?

1.在运行时交换方法。(method_exchangeImplementations)

  首先创建一个People类,有俩个类方法,+(void)run{NSLog@"跑"}和+(void)sing{NSLog@"唱歌"}.

  依次调用这两个方法,控制台会依次输出 跑 和 唱歌 。

  用runtime获取到People类的run方法。

  Method m1=class_getClassMethod([People class], @selector(run)) ;

  同理获取sing方法。

  Method m2=class_getClassMethod([People class], @selector(sing)) ;

  交换两个方法。

  method_exchangeImplementations(m1, m2) ;

  在依次调用这个两个方法,控制台会输出 唱歌 和 跑。

  实例方法用 class_getInstanceMethod 来获取。

 

2.在分类中设置属性。

  众所周知,在分类中是无法添加实例变量的。就算在分类中声明了一个属性,也只是生成了这个属性的set方法和get方法,并不会生成这个属性。并且,虽然打点调用会有

  提示,但是一旦运行程序就会崩溃。所以要想在分类中添加实例变量还得使用runtime来操作。

  使用到的是  

  void objc_setAssociatedObject(id object , const void *key ,id value ,objc_AssociationPolicy policy) 这个方法。

  其中:

  object就是你想要添加属性的对象。

  key则是你想保存的属性的键。

  value则是你想保存的属性的值。

  policy则是你想保存的属性的属性(assign,copy之类的)。

  比如在一个分类中声明了一个属性。

  @property(nonatomic,copy)NSString* name

  在其set方法中这么调用:

  char nameKey ;//声明属性的键。

  -(void)setName:(NSString *)name

  {

    objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC) ;//关联 键和值

  }

  在其get方法中这么调用来获取这个属性:

  -(NSString* )name

  {

    return objc_getAssociatedObject(self, &nameKey) ;

  }

  这样就在分类中添加了一个属性。

  

Runtime初学习

标签:

原文地址:http://www.cnblogs.com/zhoujieBlog/p/5731077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!