IOS 高级开发 runtime(二)
二、移魂大法
使用runtime还可以交换两个函数。先贴上代码和执行结果。
#import <Foundation/Foundation.h> @interface DZLPerson : NSObject @property(nonatomic,weak)NSString *name;
@property(nonatomic,assign)NSInteger age; -(void)test_inPerson; @end
#import "DZLPerson.h" @implementation DZLPerson -(void)test_inPerson
{
NSLog(@"%s",__func__);
} @end
以上是person类,下面还是以之前的那个分类作为例子
#import "DZLPerson.h" @interface DZLPerson (Job) @property(nonatomic,copy)NSString* job; -(void)test_inCategory; @end
#import "DZLPerson+Job.h"
#import <objc/runtime.h> static NSString *key=@"dzl"; //利用静态变量地址唯一不变的特性 @implementation DZLPerson (Job) -(void)test_inCategory
{
NSLog(@"%s",__func__);
} -(void)setJob:(NSString *)job
{ objc_setAssociatedObject(self, &key, job, OBJC_ASSOCIATION_COPY);
} -(NSString *)job
{
return objc_getAssociatedObject(self, &key);
} @end
下面是执行的主函数
- (void)viewDidLoad
{
[super viewDidLoad]; Method m1=class_getInstanceMethod([DZLPerson class], @selector(test_inPerson));//获取<span style="font-family: Arial, Helvetica, sans-serif;">DZLPerson类中的test_inPerson方法</span> Method m2=class_getInstanceMethod([DZLPerson class], @selector(test_inCategory));//同理 method_exchangeImplementations(m1, m2); DZLPerson *person=[[DZLPerson alloc] init];
[person test_inCategory]; }
执行结果如下:
2015-04-10 23:02:11.954 runtime讲解[10564:507514] -[DZLPerson test_inPerson]
我们会发现,两个test方法的实现被交换了。当我们调用test_inCategory方法时,执行的却是test_inPerson。以上的代码很简单,相信大多数人都能看懂,这里我就不一一解释了,看一下runtime函数名字就知道它的作用了。其实我想说的是,它为什么就交换了呢?下面我用图片来解释一下。
当我们调用方法的时候,系统会首先找到这个方法的SEL ,然后根据SEL所对应的IMP 去执行方法。所有名字相同的方法都对应着同一个SEL ID。那么如果有多个类中都实现了同一个名字的方法,那么系统是怎么区分执行呢?比如A类实现了test 方法,B类也实现了test方法,那么A类对象和B类对象都执行test方法时,到底执行哪个IMP对应的方法呢?这就涉及到了对象的isa指针。每个对象都有一个isa 指针,指向对象的类。那么系统根据isa 指针区分对象所要执行的方法,这样就不会错乱了。
IOS 高级开发 runtime(二)的更多相关文章
- IOS高级开发 runtime(一)
一. 简介 IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度.要想使用runtime,首先要引入系统的头文件. <span style="font-size:18p ...
- iOS 高级开发 runtime(三)
三 .动态添加方法 我们可以通过runtime动态地添加方法.那么到底啥叫动态添加方法呢?动态添加方法就是当我们程序运行时才知道我们应该调用哪个方法.我们首先需要了解这一点,当我们编写完一段代码后,我 ...
- (转发)IOS高级开发~Runtime(二)
一些公用类: @interface ClassCustomClass :NSObject{ NSString *varTest1; NSString *varTest2; NSString *varT ...
- (转发)IOS高级开发~Runtime(四)
用C代替OC: #import <objc/runtime.h> #import <objc/message.h> #import <stdio.h> extern ...
- (转发)IOS高级开发~Runtime(三)
11.系统类的方法实现部分替换 - (void) methodExchange { Method m1 = class_getInstanceMethod([NSStringclass],@selec ...
- (转发)IOS高级开发~Runtime(一)
IOS高级开发-Runtime(一) IOS高级开发-Runtime(二) IOS高级开发-Runtime(三) IOS高级开发-Runtime(四) 一些公用类: @interface Custom ...
- iOS蓝牙开发(二)蓝牙相关基础知识
原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...
- IOS高级开发之多线程(四)NSOperation
1.什么是NSOperation,NSOperationQueue? NSOperation是一个抽象的基类,表示一个独立的计算单元,可以为子类提供有用且线程安全的建立状态,优先级,依赖和取消等操作. ...
- IOS高级开发~Runtime(二)
#import <Foundation/Foundation.h> @interface CustomClass : NSObject { NSString *varTest1; NSSt ...
随机推荐
- APMServ5.2.6 + xdebug + notepad++调试环境配置
(原创文章,转载请注明出处:http://www.cnblogs.com/qzhforthelife/archive/2013/06/21/3147772.html) 刚整了两个多小时才把这个调试环境 ...
- linux 开机自动挂载ntfs盘
1) 查看盘符UUID vellbibi@vell001:~$ sudo blkid [sudo] password for vellbibi: /dev/sda1: UUID="bce9e ...
- Linux下安装mysql5.6.11(找点有用的信息太费劲)(转)
Linux下安装mysql5.6.11(找点有用的信息太费劲) (2013-04-25 10:25:09) 1.申请阿里云Linux服务器 昨天在阿里云申请了一个免费试用5天的Linux云服务 ...
- hadoop中Combiner使用中需要注意的地方
今天在写一个MR的时候,用到了combiner.在使用过程中,遇到了一些问题,特此记录一下. Combiner分为两种,一种是可插拔的,一种是不可插拔的. 可插拔的:Combiner和Reduce的处 ...
- centos6.4 yum kvm
1. 安装软件包: yum -y install virt-manager; yum install qemu-kvm yum install libvirt yum install libvi ...
- 北京Uber优步司机奖励政策(2月6日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- A Tour of Go Making slices
Slices are created with the make function. It works by allocating a zeroed array and returning a sli ...
- oc学习之路----代理模式
今天刚学完oc的代理模式,觉得有点新奇,第一次接触,原理 A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议 (protocol),B继承该协议来完成A代理给他的 ...
- 用Windbg来看看CLR的JIT是什么时候发生的
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Windbg来看看CLR的JIT是什么时候发生的.
- BAPI
MM模块 1. BAPI_MATERIAL_SAVEDATA 创建物料主数据 注意参数EXTENSIONIN的使用,可以创建自定义字段 例如:WA_BAPI_TE_MARA-MATERIAL = IT ...