`
janedoneway
  • 浏览: 580556 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SEL和IMP

 
阅读更多

 

1. SEL和IMP

最早我把SEL理解为函数指针,现在看来,不是这样的。

1.1 SEL类型

SEL类型的变量,可以通过@selector(方法名)来取得,当然了,Objective C的方法名,我们也知道了,多么恶心(比Java废话还多)。

而它真正得到的,只要方法名一样,它的值就是一样的,不管这个方法定义于哪个类,是不是实例方法【再说了,@selector的时候,除了方法名也没有什么类啊,对象啊什么事情】。

所以我现在把它理解为“方法名的某种映射结果”。(从C++程序员的眼光看,我觉得没啥可以对应的,既不是函数指针,也不是函数指针类型,像是函数指针类型的名字吧。)

1.2 IMP类型

这个才是函数指针,IMP可以从 对象 & SEL的方法得到:

IMP imp = [self methodForSelector:selector];

这是IMP的定义:

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

另外注意NSObject里面的这两个方法:

- (IMP)methodForSelector:(SEL)aSelector;
+ (IMP)instanceMethodForSelector:(SEL)aSelector;

 

2. Objective C可以动态添加方法...

class_addMethod,用就行了,转到定义,可以看看其他的方法,也很动态(这也太动态了,Java,C#也不行啊)。

"定义于runtime.h"

 

3. resolveInstanceMethod

这个方法挺BT的。


我暂时个人理解为方法劫持吧,方法和属性的调用,都会先跑到这里来,具体看文档吧:
http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/chapter_5_section_2.html

4. 模拟NSManagedObject

分享到:
评论

相关推荐

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

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

    程序员移动开发中的iOS安全攻防知识分享

    在iOS系统中有三种方式可以实现hook:runtime利用OC的runtime api,动态改变SEL和IMP的对应关系,达到方法调用流程改变的目的;fishhook,它是Facebook开源的一个动态修改链接Mach-O文件的工具;Cydia Substrate,它...

    Objective-C 思维导图.pdf

    - **5.2 SEL 和 IMP** - **SEL 类型**:表示一个方法选择器。 - **IMP 指针**:指向方法的实际实现。 - **5.3 动态方法解析** - **resolveInstanceMethod**:用于解决未知方法的调用。 - **resolveClassMethod*...

    iOS runtimeIMP指针和消息转发机制Demo

    本文将详细探讨“iOS runtimeIMP指针和消息转发机制Demo”中的核心概念,包括Runtime、IMP指针以及消息转发机制,并通过一个名为`MethodSwizzlingIMPdemo`的示例来阐述它们的实际应用。 1. **Runtime(运行时)**:...

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

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

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

    在OC中,`SEL`(选择器)代表一个方法名,而`IMP`(实现指针)则指向方法的实际实现。当我们谈论动态添加方法时,实际上就是为一个类注册一个新的`SEL`,并提供对应的`IMP`。 3. **动态添加方法的基本步骤** - ...

    BCM5396 评估板原理图

    BCM5396评估板提供了丰富的接口选项,包括MII/GMII接口、串行LED接口、SPI/EEPROM接口、WS接口和IMP接口等。通过深入分析这些接口和信号的功能,可以更好地理解BCM5396的工作原理,并为其在实际应用中的优化提供指导...

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

    - 调用IMP可以直接执行对应的方法实现,如`void (*func)(id, SEL)`,其中`id`是对象指针,`SEL`是选择子。 5. **方法的类型编码(Method Type Encoding)** - 类型编码是每个方法的参数类型和返回值类型的ASCII...

    Method Swizzling示例

    在iOS和Mac OS X开发中,Objective-C作为主要的编程语言,提供了一种独特且强大的特性——方法交换(Method Swizzling)。它允许我们在运行时修改类的方法实现,这一特性在调试、AOP(面向切面编程)以及插件化开发...

    Object-C 疑问解答

    **6.2 如何通过指定的 SEL 获取 IMP?** 可以使用 `class_getMethodImplementation` 函数来获取方法的 IMP。 **6.3 如何通过指定的 IMP 发送消息?** 可以通过 `objc_msgSend` 函数来实现。 **6.4 如何将 IMP ...

    objc runtime 源码 208

    在runtime中,每个方法都是一个结构体,包含了SEL(selector)、IMP(实现指针)和其他信息。`method_copyArgumentType`和`method_copyReturnType`可以获取方法的参数类型和返回类型,`method_...

    runtime 消息发送和转发 动态创建类添加属性方法等

    需要注意的是,方法的实现必须提供,通常通过IMP(函数指针)完成。 8. **访问类的变量、属性、方法**:runtime提供了许多API用于访问和操作类、属性和方法。例如,`class_getInstanceVariable()`用于获取实例变量...

    西门子PLC中使用SCL语言编程的技巧.docx

    H1_CountImp:=Imp这样的方式访问结构成员。 2. 替代Set/Reset指令:在SCL中,不需要专门的Set/Reset指令。可以通过条件语句实现相同的功能。例如,`IF THEN Variable name:=1; END_IF;`表示置位,而添加Else部分,...

    iOS 给已有类添加属性

    本文将深入探讨如何利用Runtime机制给已有的类添加对象属性和非对象属性。 首先,理解Runtime机制是关键。Objective-C的Runtime系统是其动态特性的基础,它允许在程序运行过程中动态地获取类的信息、改变类的行为,...

    Method Swizzling 和 AOP 实践1

    通过Objective-C的Runtime API,我们可以获取方法的SEL(选择器)和IMP(实现),然后交换它们,达到在不修改原有代码的情况下注入额外功能的目的。 以下是一个简单的Method Swizzling示例: ```objc // 创建一个...

    ExchangeTestApp.zip

    IMP newImp = imp_implementationWithBlock(^{ // 新的实现 }); BOOL isMethodExist = class_replaceMethod([SomeClass class], selector, newImp, "@@:"); if (!isMethodExist) { NSLog(@"Failed to replace ...

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

    5. **类方法中的SEL与IMP**: - 在类方法中,可以使用`self`配合`@selector()`获取类方法的SEL,然后通过`class_getClassMethod()`获取对应的IMP(实现)。 - 这种方式常用于动态方法解析,如`...

    objc4-750-master.zip

    方法选择器(SEL)是方法的唯一标识,IMP是方法实现的指针。在runtime中,可以使用`sel_registerName`注册新的选择器,`methodForSelector:`获取对应选择器的方法实现。 8. **元类(Meta-class)** 元类是Objective...

Global site tag (gtag.js) - Google Analytics