5.5,函数指针
在讲解函数指针之前,我们先参看一下图5-2,函数指针的数值实际上就是图5-2里面的地址,有人把这个地址成为函数的入口地址。在图5-2里面我们可以通过方法名字取得方法的ID,同样我们也可以通过方法ID也就是SEL取得函数指针,从而在程序里面直接获得方法的执行地址。或者函数指针的方法有2种,第一种是传统的C语言方式,请参看“DoProxy.h” 的下列代码片断:
1 void(*setSkinColor_Func) (id, SEL, NSString*);
2 IMP say_Func;
其中第1行我们定义了一个C语言里面的函数指针,关于C语言里面的函数指针的定义以及使用方法,请参考C语言的书籍和参考资料。在第一行当中,值得我们注意的是这个函数指针的参数序列:
第一个参数是id类型的,就是消息的接受对象,在执行的时候这个id实际上就是self,因为我们将要向某个对象发送消息。
第二个参数是SEL,也是方法的ID。有的时候在消息发送的时候,我们需要使用用_cmd来获取方法自己的SEL,也就是说,方法的定义体里面,我们可以通过访问_cmd得到这个方法自己的SEL。
第三个参数是NSString*类型的,我们用它来传递skin color。在Objective-C的函数指针里面,只有第一个id和第二个SEL是必需的,后面的参数有还是没有,如果有那么有多少个要取决于方法的声明。
现在我们来介绍一下Objective-C里面取得函数指针的新的定义方法,IMP。
上面的代码的第一行比较复杂,令人难以理解,Objective-C为我们定义了一个新的数据类型就是在上面第二行代码里面出现的IMP。我们把鼠标移动到IMP上,单击右键之后就可以看到IMP的定义,IMP的定义如下:
typedef id (*IMP)(id, SEL, );
这个格式正好和我们在第一行代码里面的函数指针的定义是一样的。
我们取得了函数指针之后,也就意味着我们取得了执行的时候的这段方法的代码的入口,这样我们就可以像普通的C语言函数调用一样使用这个函数指针。当然我们可以把函数指针作为参数传递到其他的方法,或者实例变量里面,从而获得极大的动态性。我们获得了动态性,但是付出的代价就是编译器不知道我们要执行哪一个方法所以在编译的时候不会替我们找出错误,我们只有执行的时候才知道,我们写的函数指针是否是正确的。所以,在使用函数指针的时候要非常准确地把握能够出现的所有可能,并且做出预防。尤其是当你在写一个供他人调用的接口API的时候,这一点非常重要。
分享到:
相关推荐
C语言是计算机编程的基础,它是Objective-C的重要基石。在学习Objective-C之前,深入理解C语言的知识点至关重要。C语言以其高效、简洁和灵活性被广泛应用于系统编程、嵌入式开发、游戏引擎等领域。本资料主要涵盖了...
Objective-C是基于C语言的,主要用于构建iOS和macOS应用程序,而Objective-C++则是Objective-C的一个扩展,它引入了C++的特性,使得开发者可以同时利用Objective-C的动态特性和C++的面向对象编程能力。 ### ...
书中会讲解基本的数据类型、控制结构、函数和指针等基础知识,同时介绍Objective-C特有的动态类型和消息传递机制。 2. **面向对象编程**:Objective-C是面向对象的语言,它支持类、继承、封装和多态等概念。书中会...
C语言提供了基本的数据类型(如int、char、float等)、控制流程(如if语句、for循环、while循环)、函数以及指针等概念。在Objective-C中,这些基础知识仍然适用,但Objective-C引入了面向对象的特性,如类、对象、...
Objective-C中的继承允许一个类(子类)继承另一个类(父类)的属性和方法,而多态允许使用父类类型的指针来引用子类类型的对象。 Objective-C还支持协议(protocols)的概念,这类似于其他语言中的接口。协议定义...
本次整理的“Objective-C经典面试题”中的知识点,主要针对C语言中的指针概念、Objective-C语言的数组和指针操作、宏定义及使用、预处理器指令的应用、内存分配与释放、以及Objective-C中委托(Delegation)和字符串...
第一部分全面讲解了Objective-C语言的基础知识,包括类、对象、方法、数据类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等。这部分为读者打下了坚实的语言基础,适合编程初学者...
7. 基本的C语言特性:因为Objective-C是建立在C语言之上的,所以本书也覆盖了C语言的基本语法和特性,包括指针、函数等。 8. Foundation框架:在第二部分中,书中介绍了Foundation框架,这是开发OS X和iOS应用程序...
- **指针**:熟悉C语言的指针操作对理解Objective-C中的对象引用至关重要。 - **内存管理**:Objective-C使用引用计数进行内存管理,后来引入的ARC(Automatic Reference Counting)则自动处理内存管理。 3. **...
在Objective-C中,对象通过发送`alloc`消息(即调用`malloc()`或等价函数)进行分配,而初始化则通过调用`init`方法完成。 类在Objective-C中扮演着对象工厂的角色。大部分类不需自己实现`+alloc`方法,而是从其父...
Objective-C是一种面向对象的编程语言,它是C语言的一个超集,并且是用于Mac OS和iOS应用开发的主要语言。它具有动态绑定、内存管理、面向对象的特性,允许开发者编写高效和可重用的代码。 第一章程序整体语法结构...
Objective-C是C语言的超集,这意味着任何有效的C代码都可以在Objective-C中使用。由于C++也是C的超集,因此Objective-C也能够直接支持C++代码。开发者可以在Objective-C类中嵌入C++代码,反之亦然。 2. **命名空间...
在这一部分中,还涉及了函数、数组、结构体和指针等C语言元素,因为Objective-C建立在C语言之上,所以对这些基础概念的掌握对于学习Objective-C至关重要。 第二部分关注于Foundation框架的详细阐述。Foundation框架...
除此之外,Objective-C还拥有指针类型,这对于管理内存和实现指针操作十分重要。变量作为存储数据的容器,在程序中起到关键作用。通过声明变量,开发者可以定义存储不同类型数据的变量,并通过赋值来更改这些变量的...
全书共分为四大部分:第一部分全面讲解了objective-c语言的基础知识,包括类、对象、方法、数据类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二部分详细阐述了foundation...
从C++到Objective-C的转型指南涉及到了几个重要的IT知识领域,主要包括编程语言的比较、面向对象编程的概念、Objective-C语言的语法特点以及与C++的共性和差异。 首先,Objective-C是一种主要在苹果公司产品开发中...
`NSLog`是Objective-C中的日志输出函数,类似于C语言的`printf`。它支持多种格式化输出,例如`%@`用于输出对象,`%d`或`%i`用于输出有符号整数,`%u`用于输出无符号整数,`%f`用于输出浮点数,`%p`用于输出指针地址...
- **块(Block)**:类似于C语言中的函数指针,但具有更多功能,可以捕获局部变量并在其他地方使用。 以上就是关于Objective-C的一些基础和进阶知识点的详细介绍,希望对您学习和掌握Objective-C有所帮助。
块是Objective-C中一种重要的数据类型,类似于C语言中的函数指针。它们可以被传递给方法或者存储在变量中。例如: ```objective-c void (^myBlock)(void) = ^{ NSLog(@"This is a block!"); }; myBlock(); ``` ##...