一:runtime简介:也是面试必须会回答的部分

二:runtime的消息机制

#import "ViewController.h"
#import <objc/message.h>
#import "Person.h"
/*
总结:
1:
runtime:必须要导入头文件 <objc/message.h>,此头文件中已经引入了<objc/runtime.h>
任何方法调用本质:发送一个消息,用runtime发送消息.OC底层实现通过runtime实现
验证:方法调用,是否真的是转换为消息机制
runtime都有一个前缀,谁的事情使用谁 2:((NSObject *(*)(id, SEL))(void *)objc_msgSend)([NSObject class], @selector(alloc)); 此段代码可简化为:objc_msgSend([NSObject class], @selector(alloc));,其中(NSObject *(*)(id, SEL))此为一个函数指针,返回值类型为NSObject *,参数为(id, SEL)),id代表谁发送的消息 ,SEL:函数入口,发送什么消息 xcode6之前,苹果运行使用objc_msgSend.而且有参数提示
xcode6苹果不推荐我们使用runtime 3:解决消息机制方法提示步骤
查找build setting -> 搜索msg,设置为NO,一般配置信息都在build setting中设置,build Phases一般是引入系统框架和设置参与编译的.m文件,.h文件不参与编译
最终生成消息机制,编译器做的事情
最终代码,需要把当前代码重新编译,用xcode编译器,clang 4:runtime:方法都是有前缀,谁的事情谁开头
开发中使用场景:
需要用到runtime,消息机制
1.装逼
2.不得不用runtime消息机制,可以调用系统API中或是框架中的私有方法 5:消息机制的调用过程:
面试:
方法调用流程
怎么去调用eat方法 ,对象方法:类对象的方法列表 类方法:元类中方法列表
1.通过isa去对应的类中查找
2.注册方法编号
3.根据方法编号去查找对应方法
4.找到只是最终函数实现地址,根据地址去方法区调用对应函数 过程:一个对象被初始化后,内部会有一个isa指针,指向类对象(类对象的方法列表),类对象中会有一个方法列表,此时会根据方法列表注册方法编号,方法编号对应方法列表,根据方法编号查找对应的方法,找到的只是最终函数的实现地址,根据地址去内存中的方法区调用对应函数 内存的5大区
1.栈 2.堆 3.静态区 4.常量区 5.方法区
1.栈:不需要手动管理内存,自动管理
2.堆,需要手动管理内存,自己去释放 */ @interface ViewController () @end @implementation ViewController /**
* 1:objc_getClass("Person")表示获得类对象,sel_registerName("alloc")表示注册一个方法
2:调用eat:是对象调用eat,消息机制就是谁发送的什么消息:objc_msgSend(p, @selector(eat));
*/
- (void)viewDidLoad {
[super viewDidLoad]; // Person *p = [Person alloc];
Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc")); // p = [p init];
p = objc_msgSend(p, sel_registerName("init")); // 调用eat
// [p eat];
objc_msgSend(p, @selector(eat));
// objc_msgSend(p, @selector(run:),20); } /**
1:一个对象的初始化方法可分解为两步:alloc 来开辟内存空间,init来初始化:id objc = [NSObject alloc];开辟内存空间的时候获得一个类对象,类对象在初始化得到一个对象objc = [objc init]; 2:上述初始化的过程用runtime来实现: //id objc = [NSObject alloc];
id objc = objc_msgSend([NSObject class], @selector(alloc));
//objc = [objc init];
objc = objc_msgSend(objc, @selector(init));
*
*/
- (void)test
{
// id objc = [NSObject alloc];
id objc = objc_msgSend([NSObject class], @selector(alloc)); // objc = [objc init];
objc = objc_msgSend(objc, @selector(init));
} @end

iOS开发runtime学习:一:runtime简介与runtime的消息机制的更多相关文章

  1. iOS开发UI篇—核心动画简介

    转自:http://www.cnblogs.com/wendingding/p/3801036.html iOS开发UI篇—核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画 ...

  2. iOS开发如何学习前端(2)

    iOS开发如何学习前端(2) 上一篇成果如下. 实现的效果如下. 实现了一个横放的<ul>,也既iOS中的UITableView. 实现了当鼠标移动到列表中的某一个<li>,也 ...

  3. iOS开发如何学习前端(1)

    iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...

  4. 关于iOS开发的学习

    关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...

  5. XMPPFrameWork IOS 开发(一)xmpp简介

    原始地址:XMPPFrameWork IOS 开发(一) XMPP : The Extensible Messaging and Presence Protocol 中文全称: 可扩展通讯和表示协议 ...

  6. IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路

    在不知不觉当中已经写了21篇内容 其实一开始是没有想些什么东西的 只是买了Air后 感觉用着挺舒服的,每天可以躺在床上,就一台笔记本,不用网线,不用电源,不用鼠标,不用键盘,干干脆脆的就一台笔记本. ...

  7. IOS开发---菜鸟学习之路--(一)

    PS(废话): 看了那么多的博客文章,发现大部分人都一直在强调写技术博客的重要性,索性自己也耐着性子写写看吧. 写博客的重要性之类的说明,我就不做复制黏贴的工作了.因为自己没有写过多少,所也不清楚是不 ...

  8. iOS开发架构学习记录

    闲着没事看了一些iOS开发架构的视频,简单的介绍了几个常用的架构设计,现将它记录如下,以后有时间再专门写这方面的内容,大家可以看看,感兴趣的就进一步学习. 一.架构基础 1.架构设计的目的 进一步解耦 ...

  9. iOS开发中KVC、KVO简介

    在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...

  10. IOS开发---菜鸟学习之路--(二十三)-直接利用键值对的方式来处理数据的感想

    首先声明,本文纯粹只是做为本人个人新手的理解.文中的想法我知道肯定有很多地方是错的. 但是这就是我作为一个新人的使用方法,对于大牛非常欢迎指导,对于喷子请绕道而行. 由于这是早上跟我学长讨论数据处理时 ...

随机推荐

  1. SSO 中间件 kisso

    SSO 中间件 kisso kisso  =  cookie sso,基于 Cookie 的 SSO 中间件.kisso 不是一套完整的登录系统, 它的定位是一把高速开发 java Web 单点登录系 ...

  2. LINUX下为apache 和 PHP 添加模块

    LINUX下为apache 和 PHP 添加模块https://www.path8.net/tn/archives/4717/opt/lampp/bin/httpd -V/opt/lampp/bin/ ...

  3. Android学习笔记技巧之给文本加边框

    BorderTextViews.Java package xiaosi.BorderTextView; import android.content.Context; import android.g ...

  4. IntelliJ IDEA 2018 Community(社区版)创建J2EE项目+Tomcat9部署

    博主打算开始系统地自学JAVA,首要问题就是解决IDE的问题, 以前用过像VS.Android Studio.Eclipse,知道Eclipse是JAVA最传统的IDE, 用过VS和AS的朋友都知道, ...

  5. 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)

    poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...

  6. ubuntu-系统密匙

    1.安装虚拟机xp,需要密匙,网上搜了一个,验证能用 MRX3F-47B9T-2487J-KWKMF-RPWBY 2.安装vm也需要密匙,如下可用 HC6JC-FPJ4M-RZM61-48852-2A ...

  7. 课程与教学管理系统(CMS):Sakai

    课程与教学管理系统(CMS):Sakai 一.总结 java的spring.Hibernate等框架开发的 J2EE的开源cms 二.SAKAI Sakai是一个自由.开源的在线协作和学习环境,由Sa ...

  8. transform属性实现翻转效果

    transform:perspective(800px) rotateY(180deg);//翻转180度,透视800px; transition-delay: 0.3s;//过程时间 opacity ...

  9. 黑马day01 xml 的解析方式

    XML编程:利用java程序去增删改查(CRUD)xml中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了非常多的解析api sun jaxp既有dom方式也有sax方式,而 ...

  10. 魅族MX5和努比亚布拉格手机參数对照

    想买个Android手机锁定魅族MX5和努比亚布拉格.两个官网翻来翻去的非常难取舍,自己列了一个表对比了一下參数,本人喜欢薄一点的手机.有feel.參数对比表例如以下: 手机 魅族MX5 努比亚布拉格 ...