`
lizaochengwen
  • 浏览: 667305 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Objective-C中的SEL、IMP和Class类型(转)

 
阅读更多
这个真的很实用,也很好用。

1、SEL类型

  例子:

SEL say;
       SEL skin;

  Objective-C 在编译的时候, 会根据方法的名字(包括参数序列),生成一个用 来区分这个方法的唯一的一个 ID,这个 ID 就是 SEL 类型的。我们需要注意的是,只要方法的名字(包括参数序列)相同,那么它们的 ID 都是相同的。就是 说,不管是超类还是子类,不管是有没有超类和子类的关系,只要名字相同 那么 ID 就是一样的。

  在 程序执行的时候,我们可以方便的通过方法的名字,获取到方法的 ID 也就是我们所说的 SEL, 反之亦然。具体的使用方法如下:

1    SEL 变量名 = @selector(方法名字);
       2    SEL 变量名 = NSSelectorFromString(方法名字的字符串);
       3    NSString *变量名 = NSStringFromSelector(SEL 参数);

其中第 1 行是直接在程序里面写上方法的名字,第 2 行是写上方法名字的字符串,第 3 行是通 过 SEL 变量获得方法的名字。我们得到了 SEL 变量之后,可以通过下面的调用来给一个对象发 送消息:

[对象 performSelector:SEL 变量 withObject:参数 1 withObject:参数 2];
这样的机制大大的增加了我们的程序的灵活性,我们可以通过给一个方法传递 SEL 参数,让这 个方法动态的执行某一个方法;我们也可以通过配置文件指定需要执行的方法,程序读取配置文 件之后把方法的字符串翻译成为 SEL 变量然后给相应的对象发送这个消息。
从效率的角度上来说,执行的时候不是通过方法名字而是方法 ID 也就是一个整数来查找方法, 由于整数的查找和匹配比字符串要快得多,所以这样可以在某种程度上提高执行的效率。

2、IMP类型
  例子:

      void(*setSkinColor_Func) (id, SEL, NSString*);//定义一个函数指针(传统C语言的处理方式)

      IMP say_Func;//定义一个IMP方式的函数指针(obj-C中推荐的方式)

       说白了IMP就是实现方法,给一个方法起个名字,实现动态调用,不用再使用[对象 message]的方式。

  IMP 的定义如下:

  typedef id    (*IMP)(id, SEL, ... );

这个格式正好和我们在第一行代码里面的函数指针的定义是一样的。
我们取得了函数指针之后,也就意味着我们取得了执行的时候的这段方法的代码的入口,这样我 们就可以像普通的 C 语言函数调用一样使用这个函数指针。当然我们可以把函数指针作为参数 传递到其他的方法,或者实例变量里面,从而获得极大的动态性。我们获得了动态性,但是付出 的代价就是编译器不知道我们要执行哪一个方法所以在编译的时候不会替我们找出错误,我们只 有执行的时候才知道,我们写的函数指针是否是正确的。所以,在使用函数指针的时候要非常准 确地把握能够出现的所有可能,并且做出预防。尤其是当你在写一个供他人调用的接口 API 的 时候,这一点非常重要。
3、Class

  类在 Objective-C 也为我们准备了类似的机制, Class 类型。当一个类被正确的编译过后,在这个编译成功的类里面,存在一个变量用于保存这 个类的信息。我们可以通过一个普通的字符串取得 这个 Class,也可以通过我们生成的对象取 得这个 Class。Class 被成功取得之后,我们可以把这个 Class 当作一个已经定义好的类来使用 它。这样的机制允许我们在程序执行的过程当中,可以 Class 来得到对象的类,也可以在程序 执行的阶段动态的生成一个在编译阶段无法确定的一个对象。
因为 Class 里面保存了一个类的所有信息,当然,我们也可以取得一个类的超类。关于 Class 类型,具体的使用格式如下:
1    Class 变量名 = [类或者对象 class];
2    Class 变量名 = [类或者对象 superclass];
3    Class 变量名 = NSClassFromString(方法名字的字符串);
4    NSString *变量名 = NSStringFromClass(Class 参数);

第一行代码,是通过向一个类或者对象发送 class 消息来获得这个类或者对象的 Class 变量。 第二行代码,是通过向一个类或者对象发送 superclass 消息来获得这个类或者对象的超类的
Class 变量。
第三行代码,是通过调用 NSClassFromString 函数,并且把一个字符串作为参数来取得 Class 变量。这个在我们使用配置文件决定执行的时候的类的时候,NSClassFromString 给我们带来 了极大的方便。
第四行代码,是 NSClassFromString 的反向函数 NSStringFromClass,通过一个 Class 类 型作为变量取得一个类的名字。
当我们在程序里面通过使用上面的第一,二或者第三行代码成功的取得一个 Class 类型的变量, 比如说我们把这个变量名字命名为 myClass,那么我们在以后的代码种可以把 myClass 当作 一个我们已经定义好的类来使用,当然我们可以把这个变量作为参数传递到其他的方法当中让其 他的方法动态的生成我们需要的对象。

本文转自:http://hi.baidu.com/men4661273/blog/item/17169561d09e10c08db10d1b.html
分享到:
评论

相关推荐

    Class(类类型),Selector(选择器SEL),函数指针(IMP)

    在Objective-C中,Class、Selector(选择器SEL)和函数指针(IMP)是三个非常重要的概念,它们构成了Objective-C动态特性的基础。下面将详细解释这三个概念以及它们之间的关系。 1. Class(类类型): 在Objective...

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

    Objective-C Runtime机制是苹果Mac和iOS平台编程中的核心组成部分,它负责支持Objective-C语言运行时的各种特性,其中objc_msgSend函数是Runtime系统中最为关键的一个函数,它处理着所有的消息发送。本文将探讨...

    objective-c的基本知识

    在 Objective-C 中,有几个核心的概念和技术,它们是语言的重要组成部分,对于理解和编写 Objective-C 代码至关重要。 ### 类别(Category) 类别是 Objective-C 的一个独特特性,允许开发者在不创建子类的情况下...

    Objective-C类方法中使用self注意事项

    在Objective-C编程中,类方法和实例方法是两种不同的调用方式,它们各自有特定的使用场景和规则。本文将详细探讨在类方法中使用`self`的关键注意事项,以帮助开发者更好地理解和避免潜在的问题。 首先,理解...

    深入浅出Object-C之消息[汇编].pdf

    在深入探讨Object-C的消息机制之前,首先我们要理解的是,...通过理解`Class`、`SEL`和`IMP`,我们可以更深入地了解如何在Objective-C中进行方法调用和动态绑定,这对于编写高效和可扩展的Objective-C代码至关重要。

    Object-C 疑问解答

    `SEL` 是 Objective-C 中的消息标识符类型,用于唯一标识一个方法。 **5.2 perform: 有什么用途?** `perform:` 方法允许您向对象发送一个指定的选择符(SEL),用于动态调用方法。 **5.3 我如何知道特定 method ...

    objc4-750-master.zip

    Objective-C runtime是一个C语言库,它负责在程序运行时管理对象、类以及方法的创建和调用。其主要功能包括消息传递、动态类型、反射等。在iOS和macOS开发中,对runtime的理解能帮助我们编写更加高效和灵活的代码。 ...

    objc runtime 源码 208

    在iOS开发中,Objective-C runtime 是一个至关重要的底层机制,它为Objective-C提供了动态性,使得语言具有灵活性和强大的功能。Objective-C runtime 是一个C语言实现的库,它负责对象的创建、方法调用、类型检查等...

    面试题整理(优化后,需要持续优化)1

    - `NSNull` 是Objective-C中的特殊对象,用于表示单个"null"值,常用于数组和字典中。 6. **NSObject占用的内存** - 一个`NSObject`实例的基本大小取决于架构和内存对齐,通常包括`isa`指针,实际大小可能因为...

    runtime介绍

    runtime在Objective-C中扮演着极其重要的角色,它允许程序在运行时动态地处理类、对象和方法等概念。 ### runtime简介 runtime是Objective-C的核心组件之一,它为Objective-C提供了强大的动态性。runtime系统提供...

    一淘网ios入门资料

    - `Class`:类指针类型,不同于C语言中的`class`关键字。 - `id`:对象指针类型,可以指向任何类的对象。 - `SEL`:选择器类型,用于表示方法名。 - `IMP`:函数指针类型,用于表示方法的实现。 - **类与接口**...

    runtime10种用法

    Objective-C中的Runtime主要指的是处理消息传递、类和对象管理的一系列底层机制。它提供了强大的功能,使得开发者能够在运行时动态地获取和操作类的信息、对象的状态等。Runtime在iOS开发中有着广泛的应用场景,本文...

    runtime原理与使用

    不同于C语言等静态类型语言,在编译阶段就能确定所有函数的调用细节,Objective-C中的函数调用是一种动态过程,即在程序执行时才能确定具体调用哪个函数。 **关键概念**: 1. **动态调用**:Objective-C中的方法...

    iOS Runtime Demo

    1. 结构体:了解`objc_class`、`objc_object`、`SEL`、`IMP`等核心结构体的含义和用途。 2. 消息传递:理解`objc_msgSend`函数的工作原理,它是Objective-C中方法调用的底层实现。 3. Method Swizzling:学习如何...

    ios runtime动态添加方法demo

    它是一个C语言库,为Objective-C提供了动态特性的支持,如消息传递、动态类型、方法解析等。在iOS应用开发中,熟练掌握Runtime技术能帮助开发者实现很多高级功能,比如KVO(Key-Value Observing)、Category的扩展、...

    runtime(获取类属性等信息实例)

    在iOS和Mac OS X开发中,Objective-C的runtime是一个强大的工具,它允许我们在运行时查询和修改类的行为。本文将深入探讨如何利用runtime获取类属性、方法和协议的信息。 首先,我们来理解什么是runtime。Objective...

    (OC)RunTime获取类的对象方法

    Objective-C(简称OC)是一种基于C语言的面向对象编程语言,广泛应用于苹果的iOS和macOS平台。在OC中,Runtime是一套强大的底层API,它允许我们在运行时动态地检查和修改程序的行为。Runtime系统是OC能够实现消息...

    Runtime 动态添加方法(1).zip

    在iOS和Mac开发中,Objective-C(简称OC)是一种强大的面向对象编程语言,它以其灵活的动态特性著称。在OC中,我们可以在程序运行时动态地添加、修改或删除方法,这一特性使得OC在很多场景下具有很高的可扩展性和...

Global site tag (gtag.js) - Google Analytics