Objective-C runtime(二)

上一篇我们通过runtime获取了Objective-C的类的相关信息,现在我们来修改、添加类。

首先来添加成员变量。之前我们获取了很多关于成员变量的信息,但是添加成员变量并不是ivar或property相关的函数,而是associatedObject相关的函数。

const char* str_key="str key";
NSString* tmp=@"tmp str";

objc_setAssociatedObject(l,str_key,tmp,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

NSString* tmp2=(NSString*)objc_getAssociatedObject(l, str_key);

objc_removeAssociatedObjects(l);

熟悉C++的同学应该都了解多态,这是C++的OOP编程的核心之一。如果我们需要在运行时动态地添加、修改某个方法,需要怎么做?策略模式?在Objective-C中我们可以通过runtime直接添加、修改方法。

① 动态添加方法

这是我们要添加的一个方法:

void add_func(id _self,SEL _cmd,NSString* _str)
{
    NSLog(@"add_func:%@\n",_str);
}

添加的代码如下:

class_addMethod([MyClass class], @selector(addFunc), (IMP)add_func, "v@:@");

[m performSelector:@selector(addFunc) withObject:@"tmp5"];
    
objc_msgSend(m, @selector(addFunc), @"tmp6");

id (*imp)(id,SEL,id)=(id (*)(id,SEL,id))[m methodForSelector:@selector(addFunc)];
imp(l,@selector(addFunc),@"tmp7");

通过class_addMethod函数可以添加方法,其中最后一个参数是标示方法的返回值与参数的。常用的如下:

v  void
@ id
: SEL
# Class
* char*

调用添加的方法不能直接使用[m addFunc]要通过runtime的performSelector,当然也能通过更基础的objec_msgSend函数或者IMP来调用。

②修改类的方法

//获得实例方法
Method func1=class_getInstanceMethod([m class], @selector(func1));
    
Method func2=class_getInstanceMethod([MyClass class], @selector(func2));
    
method_exchangeImplementations(func1, func2);
    
 //获得类方法
Method func3=class_getClassMethod([m class], @selector(func3));
    
Method func4=class_getClassMethod([MyClass class], @selector(func4));
    
method_exchangeImplementations(func3, func4);

上面的代码是交换了func1、func2两个实例方法以及func3、func4两个类方法。我们也可以通过method_setImplementation函数修改method的IMP。

runtime常见的用法就是这些,更多的函数可以在之前提到的头文件中搜索或者在Xcode中键入class、method等相关前缀来查询。

如有错误,欢迎指出!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,858评论 0 9
  • 官方源码下载地址:http://download.csdn.net/detail/liangliang103377...
    有一种再见叫青春阅读 2,058评论 2 11
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,243评论 0 7
  • 转载:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麦子阅读 791评论 0 2
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,697评论 33 466