IOS 高级开发 runtime(二)
来源:互联网 发布:nba2k17季后赛数据 编辑:程序博客网 时间:2024/04/30 14:21
二、移魂大法
使用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]
当我们调用方法的时候,系统会首先找到这个方法的SEL ,然后根据SEL所对应的IMP 去执行方法。所有名字相同的方法都对应着同一个SEL ID。那么如果有多个类中都实现了同一个名字的方法,那么系统是怎么区分执行呢?比如A类实现了test 方法,B类也实现了test方法,那么A类对象和B类对象都执行test方法时,到底执行哪个IMP对应的方法呢?这就涉及到了对象的isa指针。每个对象都有一个isa 指针,指向对象的类。那么系统根据isa 指针区分对象所要执行的方法,这样就不会错乱了。
0 0
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS 高级开发 runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime
- iosLearing高级开发~Runtime(二)
- IOS高级开发~Runtime(一)
- IOS高级开发~Runtime(三)
- IOS高级开发~Runtime(四)
- IOS高级开发~Runtime(一)
- IOS高级开发~Runtime(一)
- IOS高级开发~Runtime(三)
- IOS高级开发~Runtime(四)
- Populating Next Right Pointers in Each Node--LeetCode
- ANDROID基础学习笔记_3.1_文件权限
- 回溯算法--Fire Net
- iOS 笔记《About the iOS Technologies:Cocoa Touch Layer》
- 算法练习-NOJ-1008-素数环问题
- IOS 高级开发 runtime(二)
- Java集合类
- 【One Day菜鸟到大鸟】MyBatis搭建环境
- QWidget与HWND的互相转换
- 剑指offer--从尾到头打印链表
- oracle事务
- 算法练习-NOJ-1009-迷宫问题
- 在最新的Xcode中创建Protocol和Category文件
- 黑马程序员-------------面向对象和类