runtime - Method详细笔记
Runtime中Method详细介绍
1.找到它,认识它
//*> 在objc/runtime.h中定义了Method类型,Method是一个objc_method结构体指针,结构体中包含SEL、IMP这两种类型,下面做介绍
/// An opaque type that represents a method in a class definition.
typedef struct objc_method *Method;
struct objc_method {
SEL method_name
char *method_types
IMP method_imp
}
//*> SEL 和 IMP 类型分别在objc/objc.h定义了
/// An opaque type that represents a method selector.
typedef struct objc_selector *SEL; //!> objc_selector结构体详细声明没有在objc/objc.h中查到~~waht?
/// A pointer to the function of a method implementation. 我粗糙的翻译:方法执行的函数指针~~么么哒
#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ );
#else
typedef id (*IMP)(id, SEL, ...);
#endif
2.SEL粗来
/// An opaque type that represents a method selector.
typedef struct objc_selector *SEL;
SEL官方定义的是selector的指针,也就是选择器地址。测试代码(ViewController.m)
- (void)viewDidLoad {
[super viewDidLoad];
SEL sell = @selector(viewDidLoad);
NSLog(@"%p %s",sell,__FUNCTION__);
NSLog(@"%p %s",_cmd,__FUNCTION__);
}
/*
打印结果:
2016-03-25 13:48:23.660 runtimeStudy2[5392:3259595] 0x1090a04d5 -[ViewController viewDidLoad]
2016-03-25 13:48:23.661 runtimeStudy2[5392:3259595] 0x1090a04d5 -[ViewController viewDidLoad]
说明:
1.SEL确实是指针,是一个Selector选择器的指针;
2.SEL是一个唯一的标识,例如:0x1090a04d5;
2._cmd为当前方法的SEL;
*/
//*> 需要补充的是,只要方法名一样,生成的SEL也是一样,道理你们懂得,起名字嘛,必须是一样,例如上面的那个:0x1090a04d5,还是解释一下为啥都是一样的吧,因为SEL的名字是根据方法名字进行生成的,跟在那个类或者其他的都没有关系,下面是证据:
/*
创建继承NSObject的三个类:Person、Son和Daughter,分别在他们的.m文件中写入:
+ (void)load
{
NSLog(@"%p %s",_cmd,__FUNCTION__);
}
然后运行程序,打印结果:
2016-03-25 15:25:14.915 测试1[6093:3790055] 0x10d9cdff3 +[Son load]
2016-03-25 15:25:14.915 测试1[6093:3790055] 0x10d9cdff3 +[People load]
2016-03-25 15:25:14.915 测试1[6093:3790055] 0x10d9cdff3 +[Daughter load]
SEL是一样的。
*/
3.IMP也粗来见见吧
typedef id (IMP)(id, SEL, ...); 前面那个宏不太了解啥意思,但是可以确定的是,我们应该用的是下面这个声明,typedef id(*IMP)(id,SEL,...),可能是因为void*是C++哪里的熟客,而id是objc_object类型是oc的熟客,whatever?
- IMP是函数指针,看它的定义就知道了,需要一个id,SEL,还有其他。id是objc_object类型,如果想要了解它,看我写的下篇 — 类,对象。
- Objective-C程序通过Method中的
IMP准确的执行id的SEL。高效~,比Runtime中消息传递快捷。
4.Method姗姗来迟
Method是类中的方法,####1####中表明了SEL、IMP等组成了Method的结构,SEL是x,IMP是y,x->y的映射,通过id和SEL就可以找到对应的IMP,然后执行实现的代码。
5.想要用你做点事
主要就是窥探一下objc/message.h,顺便说一下,为啥用message命名呢,呵呵达~~
//*> 1.Runtime发送消息,这个东西好玩,看大部分博客几乎都是从它讲起~~,其实可以看看官方的注释:
/**
* Sends a message with a simple return value to an instance of a class. 发送SEL和返回值(id)给接受者self(id类型)。
*
* @param self A pointer to the instance of the class that is to receive the message. self是对象指针,它来接收消息,What is objc_Object?
* @param op The selector of the method that handles the message. op是SEL小家伙(顺便说一句,有了SEL和self是不是就可以找到IMP咯)
* @param ...
* A variable argument list containing the arguments to the method. 一些参数~~么么哒
*
* @return The return value of the method. 返回值,id类型的
*/
id objc_msgSend(id self, SEL op, ...)
/*略...*/
id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
//*> 最关键的就是动态创建一个Method,嗨起来O(∩_∩)O
/// Defines a method
struct objc_method_description {
SEL name; /**< The name of the method */
char *types; /**< The types of the method arguments */
};
runtime - Method详细笔记的更多相关文章
- java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了)
java编写service详细笔记 - centos7.2实战笔记(windows类似就不在重复了) 目标效果(命令行启动服务): service xxxxd start #启动服务 servic ...
- (转载)Linux下安装配置MySQL+Apache+PHP+WordPress的详细笔记
Linux下安装配置MySQL+Apache+PHP+WordPress的详细笔记 Linux下配LMAP环境,花了我好几天的时间.之前没有配置过,网上的安装资料比较混乱,加上我用的版本问题,安装过程 ...
- xshell远程终端操作Ubuntu server安装LAMP环境之最详细笔记之二PHP开发环境配置
前言: 昨天学会了安装server,今天试着通过远程终端xshell来安装LAMP,搭配一下开发环境,也有集成环境可以一键安装使用,还是瞎折腾一下,手动一步一步搭建一下这个开发环境. 接上一篇:ubu ...
- 清晰易懂!关于PS入门的超详细笔记!
给大家分享一篇关于PS入门的超详细笔记!原理讲解清晰明了,虽不是新版本解析,但都是新手学习PS必掌懂的一些知识点,灰常的实用,转走收藏学习! 编辑:千锋UI设计 来源:PS学堂
- python聚类算法实战详细笔记 (python3.6+(win10、Linux))
python聚类算法实战详细笔记 (python3.6+(win10.Linux)) 一.基本概念: 1.计算TF-DIF TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库 ...
- ElasticSearch详细笔记
ElasticSearch详细笔记 什么是ElasticSearch Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Luce ...
- springboot超详细笔记
一.Spring Boot 入门 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,m ...
- html入门详细笔记
Web的基本概念 什么是Web? 中文翻译"网页",它是一些列技术的总称,(包括网站的前台布局.后台程序.美工.数据库开发等),我们称它为网页. Web标准 结构标准(HTML) ...
- HTTP Method详细解读(`GET` `HEAD` `POST` `OPTIONS` `PUT` `DELETE` `TRACE` `CONNECT`)
前言 HTTP Method的历史: HTTP 0.9 这个版本只有GET方法 HTTP 1.0 这个版本有GET HEAD POST这三个方法 HTTP 1.1 这个版本是当前版本,包含GET HE ...
随机推荐
- ModernUI教程:主题资源引用
已经完成的主题资源列表 提示:请关注Modern UI的开发工作,资源文件可能在演进版本中新增和删除. 资源列表可以去访问原文,原文可复制,该表未改动原文. 查看目录
- 三言两语聊Python模块–单元测试模块unittest
实际上unittest模块才是真正意义上的用于测试的模块,功能强大的单元测试模块. 继续使用前面的例子: # splitter.py def split(line, types=None, delim ...
- js的Array的map和sort实现方法
Array.prototype.mapA = function(fun /*, thisp*/) { var len = this.length; if (typeof fun != "fu ...
- C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)
1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加: 2. 添加KeyPress / KeyDown事件: 1.KeyPress 和KeyDown .Ke ...
- iOS的TCP/IP协议族剖析&&Socket
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有S ...
- 如何在word中的第3+n页处插入页面并重新从1开始
在插入页码时有时可能会遇到这种情况: word的第一页是文档名称 第二页是目录 第三页才开始是正文,而我们希望看到页码从第三页开始才是第1页. 在第三页的开头,插入分隔符“下一页”,如果office2 ...
- linux基础-第十五单元 软件包的管理
使用RPM安装及移除软件 什么是RPM rpm的文件名 rpm软件安装与移除工作中经常使用的选项 查看RPM软件包中的信息 查询已安装的软件包信息 RPM包的属性依赖性问题 什么是RPM包的属性依赖性 ...
- [转]java web简单权限管理设计
原文地址:http://blog.csdn.net/zwx19921215/article/details/44467099 最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery eas ...
- swift项目实战--微博的未登录界面的实现,和监听未登录界面两个按钮的两种实现方法
1.未登录界面的实现 微博项目中,用户不登录的话,显示的是未登录的界面.项目中TabBarVC的子控制器都是tableViewVC,所以抽取了父类,让父类判断用户是否登录,决定显示什么样的界面.loa ...
- SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法
步骤 1.继承AbstractJUnit4SpringContextTests 2.引入ApplicationContext 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...