第01天实战技术(07):Runtime(消息机制)
2017-03-24 00:00
295 查看
#####一、了解runtime的机制
1.分解runtime
2.最终通过终端 通过clang编译器 转换为最终生成代码(c++) main.cpp
3.分解代码
使用终端获取查看最终生成代码
![](http://upload-images.jianshu.io/upload_images/1090284-cc471b112c1811a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1090284-6976f5afe94b1710.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
---objc
#####二、练习
Xcode6之前,苹果允许使用objc_msgSend,而且有参数提示,Xcode6 苹果不推荐我们使用runtime
######我们在使用Xcode6之后的版本需要设置 编译器 不严格检查消息机制
![](http://upload-images.jianshu.io/upload_images/1090284-5823899e1e775200.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1.分解runtime
id objc = [NSObject alloc]; // 分配内存 objc = [objc init]; // 初始化 // 最终生成消息机制, 编译器做的事情 // 最终代码, 需要把当前重新编译,用Xcode编译器,clang // clang -rewrite-objc main.m 查看最终生成代码 // 最终会转换为 c++ // 通过编译器 最终会生成一个 main.cpp (c++的文件) // 如何快速查找代码
2.最终通过终端 通过clang编译器 转换为最终生成代码(c++) main.cpp
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; }
3.分解代码
// NSString *str = (NSString *)@1; // (NSString *) 强转 ((void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")); 强转一个函数指针 NSObject *(*) // 函数的指针 (id, SEL) // 参数 (void *) // id objc_msgSend // 函数 (objc_getClass("NSObject") // 函数 [NSObject alloc] ===== objc_msgSend(objc_getClass("NSObject"), sel_registerName("alloc")); // 发送消息 [objc init] ===== objc_msgSend((id)objc, sel_registerName("init")) // 发送消息 sel_registerName 注册了一个方法名字 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"));
使用终端获取查看最终生成代码
![](http://upload-images.jianshu.io/upload_images/1090284-cc471b112c1811a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1090284-6976f5afe94b1710.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
---objc
#####二、练习
Xcode6之前,苹果允许使用objc_msgSend,而且有参数提示,Xcode6 苹果不推荐我们使用runtime
######我们在使用Xcode6之后的版本需要设置 编译器 不严格检查消息机制
// Xcode6 苹果不推荐我们使用runtime // 找到 build settings -> 搜索 msg
#pragma 使用runtime 创建一个初始化一个对象 /* 官方的最终代码 可以模仿 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")); */ // objc_msgSend() //重点 ---- ((NSObject *(*)(id, SEL))(void *)objc_msgSend)() 函数类型 错误: too few arguments to function call, expected 2 ,have 0 : 缺少2个参数 (id, SEL) // 类的方法的本质 : 类对象 调用[NSObject class] // id : 谁发送消息 // SEL : 发送什么消息 // [NSObject class] // Xcode6之前,苹果允许使用objc_msgSend,而且有参数提示 // Xcode6 苹果不推荐我们使用runtime // 找到 build settings -> 搜索 msg // enable strict checking of objc_msgSend Claas 严格检查消息机制 (设置为No,那么使用消息机制 就会有参数提示) // id objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)([NSObject class],@selector(alloc));//expected ':' after expression : 缺少分号 // id objc = objc_msgSend(<#id self#>, <#SEL op, ...#>) id objc = objc_msgSend([NSObject class], @selector(alloc)); // objc = [objc init]; objc = objc_msgSend(objc, @selector(init));
![](http://upload-images.jianshu.io/upload_images/1090284-5823899e1e775200.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1090284-188e775ca9a12b2c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
相关文章推荐
- 第01天实战技术(08):Runtime(消息机制调用多个参数)
- 第01天实战技术(13):Runtime(动态添加属性)
- 第01天实战技术(11):Runtime(交换方法)
- 第01天实战技术(06):runtime简介
- 第01天实战技术(10):Runtime(交换方法自定义UIImage)
- Objective-C总Runtime的那点事儿(一)消息机制
- Objective-C总Runtime的那点事儿(一)消息机制
- Objective-C runtime之消息转发机制(三)
- Objective-C runtime之消息转发机制(三)
- 消息推送机制技术设计
- iOS开发之深入探讨runtime机制03-runtime的方法与消息
- Android实战技术:理解Binder机制
- Objective-C runtime之消息转发机制(三)
- runtime系列2---Messaging--消息机制和动态绑定
- Objective-C总Runtime的那点事儿(一)消息机制
- runtime浅谈(一)动态运行时和消息机制
- Objective-C runtime之消息转发机制(三)
- Windows的消息机制与消息重定向技术
- Objective-C总Runtime的那点事儿(一)消息机制
- Objective-C runtime之消息转发机制(三)