Runtime(消息机制)笔记
2017-01-18 15:16
204 查看
Runtime学习笔记,一个简单的例子来演示下Runtime消息机制
Demo链接
创建一个控制台应用,在main.m中
打开控制台,cd到main.m文件所在文件夹,输入
打开main.cpp文件,wtf?!上十万行代码……
去掉所有强制转换,下面的代码是不是看起来就很熟悉了呢?
利用Runtime消息机制,我们可以访问别人写的一些私有方法,而不去改变别人的代码(私自改变别人的代码是要吃砍刀的,切记,切记)
创建一个Person对象,开放一个方法- eat,创建一个私有方法- count:
Demo链接
创建一个控制台应用,在main.m中
int main(int argc, const char * argv[]) { @autoreleasepool { id objc = [NSObject alloc]; objc = [objc init]; } return 0; }
打开控制台,cd到main.m文件所在文件夹,输入
clang -rewrite-objc main.m,然后你发现在文件夹中会多出一个main.cpp的c++文件。
打开main.cpp文件,wtf?!上十万行代码……
cmd+F搜索
@autoreleasepool,你会找到最开始写的那段代码的底层实现代码
int main(int argc, const char * argv[]) { /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; id objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")); objc = ((id (*)(id, SEL))(void *)objc_msgSend)((id)objc, sel_registerName("init")); } return 0; }
去掉所有强制转换,下面的代码是不是看起来就很熟悉了呢?
id objc = objc_msgSend(objc_getClass("NSObject"),sel_registerName("alloc")); objc = objc_msgSend(objc,sel_registerName("init"));
利用Runtime消息机制,我们可以访问别人写的一些私有方法,而不去改变别人的代码(私自改变别人的代码是要吃砍刀的,切记,切记)
创建一个Person对象,开放一个方法- eat,创建一个私有方法- count:
//Person.h #import <Foundation/Foundation.h> @interface Person : NSObject -(void)eat; @end //Person.m #import "Person.h" @implementation Person -(void)eat{ NSLog(@"吃东西"); } -(void)count:(int)num{ NSLog(@"count:%d",num); } @end //ViewController.m #import "ViewController.h" #import "Person.h" #import <objc/message.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc")); p = objc_msgSend(p, sel_registerName("init")); objc_msgSend(p, sel_registerName("eat")); //在这里,count:方法是私有的。对于有参的方法,在后面按照顺序逗号隔开写参数就好。 objc_msgSend(p, sel_registerName("count:"),3); } -(void)test{ //1.导入<objc/message.h> //2.在Build Settings 中搜索msg,设置为NO //3.使用runtime id objc = objc_msgSend([NSObject class], @selector(alloc)); objc = objc_msgSend(objc, @selector(init)); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 云巴 2016 年更新合集——SDK 篇
- 第三方推送已死
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Java Runtime Environment 5.0 Update 12 下载
- php set_magic_quotes_runtime() 函数过时解决方法
- Asp.Net 程序错误Runtime Error原因与解决
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- iOS App开发中的UISegmentedControl分段组件用法总结
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现