`
ocen713
  • 浏览: 36354 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Objective-C 函数指针

阅读更多
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的时候,这一点非常重要。

分享到:
评论

相关推荐

    《Objective-C2.0程序设计(原书第2版)》_中文完整版

    全书共分为四大部分:第一部分全面讲解了Objective-C语言的基础知识,包括类、对象、方法、数据类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二部分详细阐述了Foundation...

    Objective-C 2.0程序设计

    类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二 部分详细阐述了Foundation框架,涵盖数字、字符串、集合、文件操作、内存管理、对象复制和归 档等重要内容;第三部分简要...

    《Objective-C 2.0程序设计(原书第2版)》[PDF]

    全书共分为四大部分:第一部分全面讲解了objective-c语言的基础知识,包括类、对象、方法、数据类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二部分详细阐述了foundation...

    Programming in Objective-C, 4th Edition

    全书共分为四大部分:第一部分全面讲解了Objective-C语言的基础知识,包括类、对象、方法、数据类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二部分详细阐述了Foundation...

    Objective-C2.0程序设计

    第1部分 Objective-C语言 第2章 Objective-C程序设计 2.1 编译并运行程序 2.1.1 使用Xcode 2.1.2 使用Terminal 2.2 解释第一个程序 2.3 显示变量的值 2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 ...

    Objective-C实现二叉树遍历算法(源代码)

    本文展示了如何在Objective-C中实现一个简单的二叉树算法。首先,定义了一个二叉树节点的类BinaryTreeNode,用于存储数据和指向左右子节点的指针。接着,定义了一个二叉树类BinaryTree,该类包含一个根节点指针,并...

    Using Swift with Cocoa and Objective-C完整中文CocoaChina精校版

    Objective Objective Objective Objective-C选择器 选择器 (Selectors)(Selectors)(Selectors) (Selectors)(Selectors)(Selectors)(Selectors) 15 2.2. 2.2. 使用 Objective Objective Objective Objective-C特性...

    Objective-C 2.0 with Cocoa Foundation(中文)

    第 1 章,也就是本章 第 2 章,从 Hello,World!...第 5 章,Class 类型,选择器 Selector 以及函数指针 第 6 章,NSObject 的奥秘 第 7 章,对象的初始化以及实例变量的作用域 第 8 章,类方法以及私有方法

    Objective-C 2.0的新特性与运行时编程

    2. Objective-C 2.0的新特性: (1.)属性访问器 (2.)for-each循环 (3.)GC机制 (4.)协议的必选与可选方法 3. Objective-C 2.0的运行时编程: (1.)isa指针 (2.)SEL 与IMP (3.)objc_msgSend函数 (4.)动态方法解析 (5.)...

    Objective-C对象模型及应用

    在Objective-C语言的内部,每一个对象都有一个名为isa的指针,指向该对象的类。每一个类描述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。每一个对象都可以接受消息,而对象能够接收的消息列表是...

    Objective-C入门指南.pdf

    这篇教程是建立在假设你已经有一些基本的C语言知识,包括C数据类型、什么是函数、设么是返回值、关于指针的知识以及基本的C语言内存管理。如果您没有这些背景知识,我非常建议你读一读K&R的书:The C Programming ...

    ObjectiveCProgramming:Objective-C Programming的练习,作者是Aaron Hillegass

    Objective-C 编程:大书呆子牧场指南亚伦·希勒加斯《Objective-C Programming的练习题》,作者为Chester Chen。2015年3月20日-2015年3月26日内容[第1章你和这本书](第1章你和这本书) [第 2 章您的第一个程序](第 2...

    MABlockClosure:ObjC块->使用libffi的C函数指针

    MABlockClosure使用libffi生成包装Objective-C块的函数指针。 它将生成具有相同参数和返回类型的函数指针,当调用该函数指针时,将调用该块。 完全支持Mac OS X,并且还提供对iOS的实验性支持。 MABlockClosure是...

    SwiftMIDITrampoline:使用 Objective-C 蹦床回调的 Swift Core MIDI

    Swift 不支持 C 函数指针。 我没有在此处包含 Bonjour 代码,因此使用音频 MIDI 设置实用程序连接到网络会话。 此示例的博客文章。 更新 为了好玩,我只是添加了一个虚拟目的地和一个连接到它的 MusicSequence。 ...

    全面解析Objective-C中的block代码块的使用

    我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值、局部变量的值等。由编译器自动创建与释放。其操作方式类似于数据结构中的栈,即后进先出、...

    C++实现委托及分析

     自我感觉C#的委托针对的对象是函数,学习它的用法会发现它有些像C语言的函数指针,而Objective-c的委托针对的对象是一个对象指针,这在我写的文章对Objective-c委托的理解一文中可以清楚得看到,很容易的理解到。...

    iOS Runtime详解(新手也看得懂)

    Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。 Objective-C 是一个动态...

Global site tag (gtag.js) - Google Analytics