Runtime 中的 _cmd、 IMP

IMP

IMP-指向实际执行函数体的函数指针

#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ );
#else
typedef id (*IMP)(id, SEL, ...);
#endif

可以看到,这个函数体前两个参数是 id(消息接受者,也就是对象),以及SEL(方法的名字)


method/objc_method

method - 指向Objective C中的方法的指针

typedef struct objc_method *Method;

其中

struct objc_method {
    SEL method_name                                          OBJC2_UNAVAILABLE;
    char *method_types                                       OBJC2_UNAVAILABLE;
    IMP method_imp                                           OBJC2_UNAVAILABLE;
}                                                            OBJC2_UNAVAILABLE;

_cmd

SEL 类型的一个变量,Objective C的函数的前两个隐藏参数为self 和 _cmd


Ivar

ivar - objective C中的实例变量

typedef struct objc_ivar *Ivar;

可以看到变量的内存模型

struct objc_ivar {
    char *ivar_name                                          OBJC2_UNAVAILABLE;
    char *ivar_type                                          OBJC2_UNAVAILABLE;
    int ivar_offset                                          OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space                                                OBJC2_UNAVAILABLE;
#endif
}                                                            OBJC2_UNAVAILABLE;
时间: 2024-11-05 19:39:43

Runtime 中的 _cmd、 IMP的相关文章

Objective-C Runtime中的并发内存分配

本文由翻译自mikeash的博客,原文:Concurrent Memory Deallocation in the Objective-C Runtime译者:lynulzy(社区ID,博客) 校对:唧唧歪歪(博客) Objective-C的Runtime机制是Mac和iOS程序中的核心,而objc_msgSend函数是Runtime的核心,进言之,这个函数的核心正是方法缓存.今天将代领大家探索苹果是如何以一种线程安全且不影响程序性能的方式来调整和分配方法缓存所用内存的,其所用的技术也许是在其他

IOS 中的_cmd

OC的编译器在编译后会在每个方法中加两个隐藏的参数:一个是_cmd,当前方法的一个SEL指针.一个是self,指向当前对象的一个指针. demo: //应用程序退出后执行代码 - (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"程序退出后执行"); NSArray *modules = [[ModuleManager sharedInstance] allModules]; for (id<

OC中Runtime浅析

近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程中都会被转化成C代码去运行.比方说OC的方法调用都会转成C函数 id objc_msgSend ( id self, SEL op, - ); 而OC中的对象事实上在Runtime中都会用结构体来表示,这个结构体中包括了类名.成员变量列表.方法列表.协议列表.缓存等. 类在Runtime中的表示:

Objective-C 中的Runtime的详细使用

Runtime全面了解 一直以来,OC被大家冠以动态语言的称谓,其实是因为OC中包含的runtime机制.Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.这一组API可以在Xcode的runtime.h文档中看到. 关于Runtime的深层次的东西,在很多其他开发者的博客中都有介绍.比如下面这些. http://www.cnblogs.com/ioshe/    这篇文章对与初识runtime做了很多基

oracle中imp命令具体解释

Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件.imp使用的基本格式:imp[username[/password[@service]]],下面例举imp经常使用用法. 1. 获取帮助 imp help=y 2. 导入一个完整数据库 imp system/manager file=bible_db log=dible_db full=y ignore=y 3. 导入一个或一组指定用户所属的所有表.索引和其它对象 imp system/m

[转]Java中Runtime.exec的一些事

0 预备知识 1 不正确的调用exitValue 2不正确的调用waitFor 3 一种可接受的调用方式 4 调用认为是可执行程序的时候容易发生的错误 5 window执行的良好示例 6 不良好的重定向命令输出 7 良好的重定向输出示例 8 总结 9 问答 0 预备知识 Runtime类是一个与JVM运行时环境有关的Singleton类,有以下几个值得注意的地方: 0.1 Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一得到运行时环境的方法. 0.2

简述下Objective-C中调用方法的过程(runtime)

Objective-C是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下: objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类 然后在该类中的方法列表以及其父类方法列表中寻找方法运行 如果,在最顶层的父类(一般也就NSObject)中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 但是在这之前,ob

iOS 中runtime的运用原理

什么是runtime呢? runtime是一套比较底层的纯c语言API,我们平时编写的OC语言代码,在程序运行过程时,都会被转化成runtime的c语言代码,runtime是oc语言的幕后工作者. 举例: OC中的代码: [[ZYPerson alloc]init]; 在runtime中会转成这样: objc_msgSend(objc_msgSend("ZYPerson","alloc"),"init"); 什么时候会使用runtime呢? ru

oracle中imp命令详解 .

oracle中imp命令详解 Oracle的导入实用程序(Import utility)允许从数据库提取数据,并且将数据写入操作系统文件.imp使用的基本格式:imp[username[/password[@service]]],以下例举imp常用用法. 1. 获取帮助 imp help=y 2. 导入一个完整数据库 imp system/manager file=bible_db log=dible_db full=y ignore=y 3. 导入一个或一组指定用户所属的全部表.索引和其他对象