Objective-C中runtime机制的应用(二)

简介: Objective-C中runtime机制的应用

五、让我看看你的方法吧


       变量通过runtime机制我们可以取到和改变值,那么我们再大胆一点,试试那些私有的方法,首先我们在MyObject类中添加一些方法,我们只实现,并不声明他们:


@interface MyObject()

{

   @private

   NSString * privateThree;

}

@end

@implementation MyObject

- (instancetype)init

{

   self = [super init];

   if (self) {

       privateOne=1;

       privateTow=@"Tow";

       privateThree=@"Three";

   }

   return self;

}

-(NSString *)description{

   return [NSString stringWithFormat:@"one=%d\ntow=%@\nthree=%@\n",privateOne,privateTow,privateThree];

}

-(NSString *)method1{

   return @"method1";

}

-(NSString *)method2{

   return @"method2";

}


这样的方法我们在外面是无法调用他们的,和操作变量的思路一样,我们先要捕获这些方法:


   //获取所有成员方法

   Method * mem = class_copyMethodList([MyObject class], &count);

   //遍历

   for(int i=0;i<count;i++){

       SEL name = method_getName(mem[i]);

       NSString * method = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];

       NSLog(@"%@\n",method);

   }


打印如下:


image.png


得到了这些方法名,我们大胆的调用即可:


   MyObject * obj = [[MyObject alloc]init];

   NSLog(@"%@",[obj method1]);


Tip:这里编译器不会给我们方法提示,放心大胆的调用即可。


六、动态的为类添加方法


       这个runtime机制最强大的部分要到了,试想,如果我们可以动态的向类中添加方法,那将是一件多么令人激动的事情,注意,这里是动态的添加,和类别的最大不同在于这种方式是运行时才决定是否添加方法的。


- (void)viewDidLoad {

   [super viewDidLoad];

   //添加一个新的方法,第三个参数是返回值的类型v是void,i是int,:是SEL,对象是@等

   class_addMethod([MyObject class], @selector(method3), (IMP)logHAHA, "v");

 

   unsigned int count = 0;

   Method * mem = class_copyMethodList([MyObject class], &count);

   for(int i=0;i<count;i++){

       SEL name = method_getName(mem[i]);

       NSString * method = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];

       NSLog(@"%@\n",method);

   }

 

   MyObject * obj = [[MyObject alloc]init];

   //运行这个方法

    [obj performSelector:@selector(method3)];

 

}

//方法的实现

void logHAHA(){

   NSLog(@"HAHA");

}


运行结果如下:

image.png



从前五行可以看出,方法已经加进去了,从最后一行可以看出,执行没有问题。


七、做点小手脚


       程序员总是得寸进尺的,现在,我们要做点事情,用我们的函数替换掉类中的函数:


- (void)viewDidLoad {

   [super viewDidLoad];

   MyObject * obj = [[MyObject alloc]init];

   //替换之前的方法

   NSLog(@"%@", [obj method1]);

   //替换

   class_replaceMethod([MyObject class], @selector(method1), (IMP)logHAHA, "v");

   [obj method1];

 

}

void logHAHA(){

   NSLog(@"HAHA");

}


打印如下:

image.png



这次够cool吧,通过这个方法,我们可以把系统的函数都搞乱套。当然,runtime还有许多很cool的方法:


id object_copy(id obj, size_t size)


拷贝一个对象



id object_dispose(id obj)


释放一个对象



const char *object_getClassName(id obj)


获取对象的类名


ive


void method_exchangeImplementations(Method m1, Method m2)

交换两个方法的实现

目录
相关文章
|
存储 安全 API
Objective-C Runtime 基本使用
在上一篇文章Objective-C Runtime详解 中我们探讨了Runtime的基本原理,这篇文章我们将总结一下Runtime的一些基本使用
140 0
|
存储 缓存 算法
Objective-C Runtime 详解
最近在学习Runtime的知识,恰巧发现了这篇博客[《Objective-C Runtime》](http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/),在此基础上,进行了些许补充说明,如有错误或其他想法,欢迎提出交流。
113 0
|
安全 编译器 API
属性“__attribute__”在Objective-C中的应用
属性“__attribute__”在Objective-C中的应用
191 0
属性“__attribute__”在Objective-C中的应用
|
安全 编译器 iOS开发
Objective-C中runtime机制的应用(一)
Objective-C中runtime机制的应用
107 0
Objective-C中runtime机制的应用(一)
|
测试技术 C语言 iOS开发
|
存储 程序员 C语言
《企业级ios应用开发实战》一3.1 Objective-C的C语言特性
本节书摘来自华章出版社《企业级ios应用开发实战》一 书中的第3章,第3.1节,作者:杨宏焱,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1623 0
|
程序员 C语言 C++
《企业级ios应用开发实战》一第3章 Objective-C 语法简介
本节书摘来自华章出版社《企业级ios应用开发实战》一 书中的第3章,第3.1节,作者:杨宏焱,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1602 0
|
存储 缓存 iOS开发
深入Objective-C Runtime机制(一):类和对象的实现
1.概要      对于Runtime系统,相信大部分iOS开发工程师都有着或多或少的了解。对于Objective-C,Runtime系统是至关重要的,可以说是Runtime系统让Objective-C成为了区分于C语言,C++之外的一门独立开发语言,让OC在拥有了自己的面向对象的特性以及消息发送机制。并且因为其强大的消息发送机制,也让很多人认为Object
1954 0
|
存储 C语言 iOS开发
(转载)Objective-C总Runtime的那点事儿(一)消息机制
原文地址:http://www.cocoachina.com/ios/20141018/9960.html 找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题。
969 0
|
4月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
97 2