首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Objective C中,"id"与C中的"void*"相同,以及程序在方法调用期间如何告诉类?

在Objective-C中,id与C中的void*具有相似的性质,因为它们都允许你间接访问对象。在Objective-C中,id是一个占位符类型名,用于表示任何对象类型,无论是基本的int类型,还是自定义的对象类型。id的声明如下:

代码语言:objective-c
复制
typedef id (*Selector)(id, SEL);

在C中,void*是一个通用指针类型,它可以指向任何类型的数据。在Objective-C中,void*通常用于将对象传递给函数,或者作为函数的返回值。void*的声明如下:

代码语言:objective-c
复制
typedef void* VoidPtr;

在Objective-C中,程序在方法调用期间使用SEL类型来告诉类。SELobjc_selector宏定义的类型,它表示一个方法选择器。SEL的声明如下:

代码语言:objective-c
复制
typedef id (*SEL)(id, SEL, ...);

在Objective-C中,方法调用是通过传递一个指向方法的指针来实现的。这个指针就是SEL类型。在方法调用期间,SEL类型被指定为方法名前面的类型,方法名后面的类型则是id类型。例如,在下面的代码中,foo是一个指向foo:方法的指针:

代码语言:objective-c
复制
id obj = [MyClass new];
SEL selector = @selector(foo:);
[obj foo:123];

在这个例子中,foo:方法名前面的类型是SEL类型,方法名后面的类型是id类型。因此,foo是一个指向foo:方法的指针,它的类型是SEL。在方法调用期间,SEL被指定为@selector(foo:),因此foo方法被调用,并将123作为参数传递。

在Objective-C中,方法调用期间使用的指针类型是SEL,而不是id。这是因为SEL类型提供了更多的运行时信息,可以提供更好的调试和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++反射调用.NET(一) 反射调用第一个.NET方法

为什么要在C++调用.NET 一般情况下,我们常常会在.NET程序调用C/C++程序,使用P/Invoke方式进行调用,在编写代码代码时候,首先要导入DLL文件,然后根据C/C++头文件编写特殊...) 然而,为了保持C++.NET应用程序独立性,要求不能将.NETDLL文件放到C++应用程序目录下,因此上述步骤1不可行,需要在C++代码中使用反射来调用.NET。...注意,本文说C++反射调用,不是对C++自身进行封装反射功能,而是C++/CLI代码反射调用.NET代码,原理上跟你.NET应用反射调用另外一个.NET程序集一个道理。...C++/CLI中使用反射 反射调用第一个.NET方法 下面的方法,将会反射调用 User一个最简单方法 : public int GetUserID(string IdString){} 该方法只有一个一个参数和一个简单返回值...有了这2个简单方法,我们来看看如何调用这个.NET方法“代理”: NetLibProxy::UserProxy^ proxy = gcnew NetLibProxy::UserProxy("

3.2K100

测试 View Controllers

这个上古神器从 1997 年起就伴随 Objective-C 开发者左右,比第一款 iPhone 发布还早 10 年。现在,它已经集成到 Xcode 中了。...另外,-expect 方法告诉 mock 这个调用必须发生。当我们稍后 mock 上调用 -verify 时,如果那个方法没有被调用过,测试就会失败。...注意,示例程序,我们是这样设置 mock id mockTableView = [self autoVerifiedMockForClass:[UITableView class]]; 这是我们测试基一个方便封装...省略注入的如何工作细节(它本身是个巨大的话题),简单地说:注入是把待注入 bundle(我们测试 bundle) Objective-C 添加到运行应用程序。...如果在上面的示例程序,我们(不小心)把 PhotoCell 类同时添加到测试 bundle 和应用程序里的话,测试 bundle 调用 [PhotoCell class]会返回一个不同指针(你应用程序那个

73020
  • runtime那些事(一)——runtime基础介绍

    Legacy 版本主要用于32位Mac OS X平台上开发,而 Modern 版本用于 iPhone 程序 Mac OS X 10.5以及更新版本系统64位程序。...---- 三、 runtime 交互方式 接下来会梳理当 NSObject runtime 交互时,runtime 是如何动态加载新以及将消息转发给其它对象。 1....Foundation 框架下 NSObject 方法 iOS 体系,绝大部分Objective-C 继承根是 NSObject (NSProxy除外,NSProxy定位更适合作为消息转发代理抽象...在上述最简单Objective-C代码通过 runtime C函数转化后,可以发现: 所有的 Objective-C 方法调用都会在编译时转化成C函数 objc_msgSend 调用 objc_msgSend...关于types参数,即 IMP 函数实现返回值参数类型,可以参考官方说明文档Objective-C Runtime Programming Guide 动态解析方法过程 对象方法 执行顺序为

    1.5K20

    Objective-C Runtime编程指南(1)

    本文档查看NSObject以及Objective-C程序如何运行时系统交互。特别是,它检查了在运行时动态加载新范例,并将消息转发给其他对象。...二、使用Runtime Objective-C程序运行时系统在三个不同层次上进行交互:通过Objective-C源代码; 通过Foundation框架NSObject定义方法; 通过直接调用运行时功能...数据结构捕获和类别定义以及协议声明信息; 它们包括Objective-C编程语言中定义和协议以及方法选择器,实例变量模板和从源代码中提取其他信息讨论和协议对象。...下面的例子展示了如何调用实现setFilled:方法过程: void (*setter)(id, SEL, BOOL); int i; setter = (void (*)(id, SEL, BOOL...例如,Objective-C声明属性功能包含@dynamic指令: @dynamic propertyName; 它告诉编译器属性相关方法将被动态地提供。

    80820

    Objective-C笔记

    但在Objective-C,类别消息关系比较松散, 调用方法视为对对象发送消息,所有方法都被视为对消息回应。...这里消息就是方法标识符以及传递给方法参数信息。 发送给对象所有消息都会动态分发,这样有利于实现Objective-C多态行为。...*) foo; Objective-Cid类型类似于void指针,但是被严格限制只能使用在对象上。...在运行时,分类方法原有的方法并无区别,其代码可以访问包括私有成员变量在内所有成员变量。 若分类声明了中原有方法同名函数,则分类方法会被调用。...因此分类不仅可以增加方法, 也可以代替原有的方法。这个特性可以用于修正原有代码错误,更可以从根本上改变程序中原有行为。 若两个分类方法同名,则被调用方法是不可预测

    94040

    Objective-C关于id引发一些思考 原

    初学这门语言时,我常常从意识上将NS开头类型C语言原本那些类型分割开来,假装他们之间没有联系,只关注“世界。...本篇博客来由源自朋友一个问题:ARC环境,performSelector:withObject:方法如何传递非对象类型数据呢?这个问题乍看起来简单,但要较较真,却也并非那么简单。...因此,你可以将id类型变量赋值给任何对象类型,也可以将任何对象类型变量赋值给id类型,更重要是,使用id类型对象可以调用任意方法,都不会进行类型检查。...typedef struct objc_object *id; 二、关于voidvoid*     开发void最多地方要数标记Objective-C无返回值函数,Objective-C...在做Objective-C相关开发时,你一定遇到过CoreFoundation框架Foundation框架混用情况,CF框架都是由C语言直接实现,例如CFString,CFURL等,其虽然可以和

    1.1K60

    基础篇-ObjectC继承、类别、属性

    Objective-C,给一个扩展一个其它方法,有两种实现方式:类别和继承。 ----  继承  这个是面向对象语言都有的一个特性,子类会继承父方法和属性以及成员变量。 ...继承需要注意是:重写这个方法执行时会替换掉原来方法(就算子类没有调用这个新重写方法,这个新方法也已经被执行了),一般自己不调用这个重写方法,子类一般只调用新加方法。  ...这是Objective-C语言一个特性,可以不改变名和原来实现前提下,实现对方法扩展。...2)扩展属性,这个类别无法做到。 OC子类可以拥有和父相同名称方法子类调用时,优先去自己内部寻找,如果没有则一层一层往上找; (4)OC语言是单继承语言。...一样 -(void)show { NSLog(@"%i",_age); } 可以看出来,Objective-Csetter器没什么区别,不过getter器方法名缺少了get,因为get

    1.9K10

    【IOS开发高级系列】Objective-c Runtime专题总结

    只要方法名称相同,那么它们ID就是相同。         两个之间,不管它们是父子类关系,还是之间没有这种关系,只要方法相同,那么它SEL就是一样。每一个方法都对应着一个SEL。...SEL,前面提到过相同名字方法即使不同类定义,它们方法选择器也相同。     ...你会发现 IMP 指向方法 objc_msgSend 函数类型相同,参数都包含 id 和SEL 类型。...这里原因主要是因为C,局部变量是存储到内存栈区,程序运行时栈生长规律是从地址高到地址低。C语言到头来讲是一个顺序运行语言,随着程序运行,栈地址依次往下走。        ...最后,我们只需要确保程序启动时候调用 swizzleMethod 方法

    37130

    【iOS】运行时消息传递转发机制

    之相反,C语言使用静态绑定,也就是说,在编译期就能决定程序运行时所应该调用函数,所以C语言中,如果某个函数没有实现,编译时是不能通过。...而Objective-C是相对动态语言,运行时还可以向动态添加方法,所以编译时并不能确定方法到底有没有对应实现,编译器在编译期间也就不能报错。 本文将简单介绍消息传递机制和消息转发机制。...(一)对象消息传递机制 objc_msgSend() 在对象上调用方法Objective-C中非常普遍。用Objective-C术语来讲,这叫做“给某个对象发送某条消息”。...Objective-C给对象发送消息是如下格式: id returnValue = [someObject messgeName:parameter]; 本例,someObject叫做方法调用者...在运行时,编译器会把上面这个格式方法调用转化为一条标准C语言函数调用,该函数就是鼎鼎有名objc_msgSend(),该函数是消息objc里在运行时传递机制核心函数,其原型如下: void objc_msgSend

    8.4K50

    Objective-C高级编程》温故知新之自动引用计数

    引用数0时关灯 办公室照明管理 转换到Objective-C程序,其实就是下图 引用计数内存管理 内存管理思考方式 自己生成对象,自己所持有。 非自己生成对象,自己也能持有。...GUNstepNSObjectalloc方法间接调用NSZoneMalloc函数来分配存放对象所需内存空间,之后将内存空间置0,最后返回作为对象而使用指针。...2、苹果实现 alloc方法首先调用allocWithZone:方法,这和GNUstep实现相同,然后调用class_createInstance 函数,最后通过调用 calloc 来分配内存块...[p release]; Objective-C对象 Core Foundation 对象 Core Foundation对象主要使用在用C语言编写Core Foundation框架,并使用引用计数对象...看看汇编和苹果源码obj4库,大概知道程序如何工作

    62850

    本质-对象

    1.本质 本质其实也是一个对象(对象) 程序第一次使用该类时候被创建,整个程序只有一份。 此后每次使用都是这个对象,它在程序运行时一直存在。...引用《Effective Objective-C 2.0 编写高质量iOSOS X代码52个有效方法一段话:superclass指针确定了继承关系,而isa指针描述了实例所属。...回想一下,我们从一个数组取出来对象,其返回值是id类型。这就是为什么我们可以在这个取出来对象身上通过括号”[ ]”形式调用任何方法,却不能通过点语法来调用方法。...此处用==操作符,原因在于,对象对象是“单例”,应用程序范围内,每个Class仅有一个实例,整个内存仅有一份(因为+(void)load方法和+ (void)initialize只被调用一次...下面笔者引用《Effective Objective-C 2.0 编写高质量iOSOS X代码52个有效方法一段话来进行解释: 虽然使用"class方法"也可以查询对象类型信息。

    9.3K50

    神经病院Objective-C Runtime入院第一天—isa和Class

    把源码定义转化成图,就是上图样子。 从上述源码,我们可以看到,Objective-C 对象都是 C 语言结构体实现objc2.0,所有的对象都会包含一个isa_t类型结构体。...所以objc_class也会包含isa_t类型结构体isa。至此,可以得出结论:Objective-C 也是一个对象。...关于元,更多具体可以研究这篇文章What is a meta-class in Objective-C? 引入元之后,对象和对象查找方法机制就完全统一了。...对象实例方法调用时,通过对象 isa 获取方法实现。 对象方法调用时,通过 isa 获取方法实现。 meta-class之所以重要,是因为它存储着一个所有方法。...super并不是隐藏参数,它实际上只是一个”编译器标示符”,它负责告诉编译器,当调用方法时,去调用方法,而不是本类方法

    79730

    Objective-C高级编程》温故知新之Blocks

    Swift称作闭包 其他程序语言中 Block 名称 浅显理解 Block 1、Block 语法 完整形式 Block 语法一般C语言函数定义相比,仅有两点不同。...其实,所谓 Block 就是 Objective-C 对象。 id 这一变量类型用于存储 Objective-C 对象。... Objective-C 源代码,虽然可以像使用 void *类型那样随意使用 id, 但此 id 类型也能在 C 语言中声明。...Objective-C 对象实质 各类结构体就是基于 objc_class 结构体 class_t 结构体。...将 Block 作为 Objective-C 对象处理时,关于该类信息放置于 _NSConcreteStackBlock,信息包含成员变量、方法名称、方法实现(即函数指针)、属性以及指针。

    62540

    iOS - 老生常谈内存管理(三):ARC 面世

    摘要 ARC工作原理是在编译时添加相关代码,以确保对象能够必要时存活,但不会一直存活。从概念上讲,它通过为你添加适当内存管理方法调用来遵循MRC相同内存管理规则。...MRC下,我们可以直接在Objective-C指针类型idC指针类型void *之间进行强制转换,如Foundation对象和Core Foundation对象进行转换。..._Nonnull' // 不兼容指针类型,将 CGColorRef(又称 struct CGColor *)作为 id 类型参数传入 使用桥接转换函数参数 当在函数调用Objective-C...如果我们重写了allowsWeakReference方法并返回NO,那么如果我们将该类实例对象赋值给__weak修饰符变量,那么程序就会Crash。...《Objective-C 高级编程:iOS OS X 多线程和内存管理》书中是说:ARC下,编译器会检查方法名是否以alloc/new/copy/mutableCopy开始,如果不是则自动将返回值对象注册到

    2.1K10

    Objective-c 知识总结 -- @property

    存取方法命名要求进行编写: setter --> setValueName: getter --> valueName 不然调用属性存取方法时候,会出现访问出错; 3....木有哦 都说是类属性了,肯定用调用嘛,试试啊~~~ ? 方法提示证明有相关方法声明 ? 外部调用 ? 内部调用 好兴奋啊~~~ ?...只要知道对象支持某个方法名称,即使该对象所在接口中没有该方法声明,你也可以调用方法。...不过这么做编译器会报错,但是只要新建一个该类类别,类别.h文件写上原始方法声明,类别.m文件什么也不写,就可以正常调用私有方法了。这就是传说中私有方法前向引用。...Programming Guide》 《runtime之玩转成员变量》 《Objective-C Runtime 运行时之二:成员变量属性》 《Swift 3.0 令人兴奋,但Objective-C

    1.4K31

    iOS开发入门笔记

    C超集 Objective-C扩展了ANSI C,是C超集,也就是说: 任何C程序,不经修改,即可通过Objective-C编译器成功编译 Objective-C程序可以直接使用任何C语言代码...Java、C++世界,我们调用一个对象方法Objective-C里,这称作给类型发送一个消息,这可不仅仅是文字游戏,他们技术细节也是不同。...概念 Objective-C中一些面向对象概念,也可以Java中找到类似的实现(只能说是类似,不是完全相同),我读者基本都是Java和PHP程序员,我会在下文中尽量用Java概念来类比。...Objective-CJava、C一样,双引号表示字符串。 函数调用 前文述及,不涉及面向对象时,它和C是完全一样。...接口定义也可以写在.m文件,但最好不要这么干 需要注意是,Objective-Cinterface概念最接近CC++里头文件,它与implementation是成双成对出现,作用是声明成员变量和方法

    3.9K60

    面经之《招聘一个靠谱iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    这个概念已经定型,并且经由“属性”这一特性而成为 Objective-C 2.0 一部分。 而在正规 Objective-C 编码风格,存取方法有着严格命名规范。...,runtime库会根据对象isa指针找到该对象实际所属,然后该类方法列表以及其父方法列表寻找方法运行,然后发送消息时候,objc_msgSend方法不会返回值,所谓返回内容都是具体调用时执行...objc向一个对象发送消息时,runtime库会根据对象isa指针找到该对象实际所属,然后该类方法列表以及其父方法列表寻找方法运行,如果,最顶层依然找不到相应方法时,程序在运行时会挂掉并抛出异常...每个 Objective-C 对象都有相同结构,如下图所示: enter image description here 翻译过来就是 Objective-C 对象结构图 ISA指针 根实例变量...他们两个不同点在于:super 会告诉编译器,调用 class 这个方法时,要去父方法,而不是本类里

    1K100

    动态Objective-C——关于消息机制运行时探讨

    动态Objective-C——关于消息机制运行时探讨 一、引言     Objective-C是一种很优美的语言,至少我使用其进行编程过程,是很享受他那近乎自然语言函数命名、灵活多样方法调用方式以及配合...Objective-C是扩展C面向对象编程语言,然而其方法调用方式又和大多面向对象语言大有不同,其采用是消息传递、转发方式进行方法调用。...二、消息发送与转发机制 1.初窥消息发送机制     许多面向对象语言中方法调用都是采用obj.function这样方式,Objective-C语言中却是采用括号包裹方式进行方法调用,例如[obj...实际上,Objective-C每一句方法调用最后都会转换成一条消息进行发送。一条消息包含3部分内容:方法选择器、接收消息对象以及参数。objc_msgSend函数就是用来发送这种消息。...现在你无须纠结这些概念,举一个例子你就能明白,Objective-C开发中有加方法方法,减方法是实例对象调用方法,每一个“”中都包含一个函数列表,就是上面的objc_method_list结构体数组指针

    82040

    iOS进阶之传递消息

    Objective-C,如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用方法。...底层,所有方法都是普通C语言函数,然而对象收到消息后,究竟该调用哪个方法则完全于运行期决定,甚至可以程序运行时改变,这些特性使得Objecttive-C成为一门真正动态语言。...为了完成此操作,该方法需要在接收者所属搜寻其“方法列表”,如果能找到选择子名称相符方法,就跳至其实现代码。若是找不到,那就沿着继承体系继续向上查找,等找到合适方法之后再跳转。...这项优化对objc_msgSend非常关键,如果不这么做的话,那么每次调用Objective-C方法之前,都需要为调用objc_msgSend函数准备“栈帧”,大家“栈踪迹”可以看到这种“栈帧”。...实际编写Objective-C代码过程,大家无序担心这一问题,不过应该了解其底层工作原理。

    77260

    深入理解Kotlin Native梦想可能

    Objective-C调用时,Objective-C NString Kotlin String 也存在隐式地转换逻辑。...事实上,Objective-C 和 Swift 扩展时可以实现协议,这一点 Kotlin 无法做到。...由于当前版本 Kotlin Objective-C 调用存在较多限制,开发者需要结合具体 Kotlin 版本做好结构设计。...例如: void set_ints(int *ints, int count) { ... } Kotlin 调用 set_ints 方法如下: // 相当于 C 定义 int 数组:int...例如: 适配 iOS 时,需要提供 Objective-C/Swift 调用支持; 适配鸿蒙时,需要提供 ArkTS 互调用支持(即对 napi 调用简化和封装) 不过,通常情况下我们不需要考虑扩展平台问题

    1K11
    领券