iOS开发runtime学习:一:runtime简介与runtime的消息机制

一: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

时间: 2024-12-25 06:05:11

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

iOS开发项目篇—16OAuth授权简介

iOS开发项目篇—16OAuth授权简介 一.资源的授权 在互联网行业,公司要能长期存活下来,用户量很重要,比如腾讯.新浪,它们的用户量是非常巨大的 要想长期留住用户,用户资源(数据)的管理也很重要,如果你经常在不经过用户同意的情况下,把用户的一些资源共享出去,那肯定是留不住用户的,甚至会遭到法律的制裁 但是,有时候确实要把某些用户资源共享出去,比如第三方想访问用户的QQ数据.第三方想访问用户的新浪微博数据 要想把用户资源共享出去,就必须取得用户的同意,那么这里就有个资源授权的问题 资源授权的方

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

iOS开发UI篇—核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core Animation是跨平台的,可以用在Mac OS X和iOS平台. Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程.不阻塞主线程,可以理解为在执行动画的时候还能点击(按钮). 要注意的是,Core Animation是直接作用

IOS开发---菜鸟学习之路--(二)-数据获取

http://www.cnblogs.com/PleaseInputEnglish/p/3432024.html IOS开发---菜鸟学习之路--(二)-数据获取,布布扣,bubuko.com

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

iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或者设置Frame的ViewController.好比你在网页上放了一个Button,如果用HTML你就可以设置他的摆放位置,在哪哪个控件里.但是你不可以设置大小,颜色,圆角之类的属性.CSS专门负责HTML管不了的这些颜色啊,大小啊之类的属性.JavaScript主要负责响应事件,你把它想象成iOS

0811 iOS开发需要学习哪些内容

1.iOS开发需要学习哪些内容? 2.开发步骤 3.框架 为了方便开发者开发出强大的功能,苹果提供了各种各样的框架 [1]UIKit:创建和管理应用程序的用户界面 [2]QuartzCore:提供动画特效以及通过硬件进行渲染的能力 [3]CoreGraphics:提供2D绘制的基于C的API [4]CoreLocation:使用GPS和WIFI获取位置信息 [5]MapKit:为应用程序提供内嵌地图的接口 [6]AVFoundation:音频.视频处理 [7]--

关于iOS开发的学习

关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了iOS基本都是英文的资料,也由于封闭,文档写的相当好.在遇到新框架的时候:    弄明白框架的功能    去文档里搜搜 框架的 Programming Guide 很有用    要弄明白框架类的继承结构写iOS的程序不一定都是用OBJC,很多框架是用C写的.学习iOS开发基础可以按照下面两个方面学:    基础 (原料 钢铁 

Objective-C总Runtime的那点事儿(一)消息机制

Objective-C总Runtime的那点事儿(一)消息机制 RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何二义性.OC的函数调用成为消息发送.属于动态调用过程.在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错.而C语言在编译阶段就会报错).只有在真正运行的时候才

iOS开发架构学习记录

闲着没事看了一些iOS开发架构的视频,简单的介绍了几个常用的架构设计,现将它记录如下,以后有时间再专门写这方面的内容,大家可以看看,感兴趣的就进一步学习. 一.架构基础 1.架构设计的目的 进一步解耦. 2.耦合的方式 1)单例-彼此知道对方的存在 2)delegate-被委托方不知道委托方的存在,委托方知道被委托方的存在 3)通知-双方都不知道对方的存在 二.MVC C可以控制V的渲染,C可以修改M. V可以将用户这边采集到的数据和用户事件反馈给C做进一步的处理,V可以读取到M中的数据进而展示

iOS开发中 Quartz2D使用详细 简介

1> Quartz2D简介 *  PPT简介 什么是Quartz2D?二维的绘图引擎 什么是二维?平面 什么是引擎?经包装的函数库,方便开发者使用.也就是说苹果帮我们封装了一套绘图的函数库 同时支持iOS和Mac系统什么意思?用Quartz2D写的同一份代码,既可以运行在iphone上又可以运行在mac上,可以跨平台开发. 开发中比较常用的是截屏/裁剪/自定义UI控件. Quartz2D在iOS开发中的价值就是自定义UI控件. 图形上下文的数据类型和作用. 有多少种上下文. 自定义控件的步骤.

IOS开发-学习目录

文笔较差,就不多说废话.现在断断续续看了快一个月的ios开发了,所以写一个目前觉得比较适合自己的教程做个目录,今后的学习主要就按这个目录进行. 1.<objective-c基础教程>下载地址:http://download.csdn.net/detail/qing2005cheng/4992186 本书主要适合接触了一点objective-c\c\c++语法之后看,知识点介绍得比较连贯,按着上面的例子做的,对一些平时没注意的语法等东西都有介绍. 2.ios开发系列博客文章:http://www