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
分享到:
相关推荐
在Objective-C中,Class、Selector(选择器SEL)和函数指针(IMP)是三个非常重要的概念,它们构成了Objective-C动态特性的基础。下面将详细解释这三个概念以及它们之间的关系。 1. Class(类类型): 在Objective...
在iOS系统中有三种方式可以实现hook:runtime利用OC的runtime api,动态改变SEL和IMP的对应关系,达到方法调用流程改变的目的;fishhook,它是Facebook开源的一个动态修改链接Mach-O文件的工具;Cydia Substrate,它...
- **5.2 SEL 和 IMP** - **SEL 类型**:表示一个方法选择器。 - **IMP 指针**:指向方法的实际实现。 - **5.3 动态方法解析** - **resolveInstanceMethod**:用于解决未知方法的调用。 - **resolveClassMethod*...
本文将详细探讨“iOS runtimeIMP指针和消息转发机制Demo”中的核心概念,包括Runtime、IMP指针以及消息转发机制,并通过一个名为`MethodSwizzlingIMPdemo`的示例来阐述它们的实际应用。 1. **Runtime(运行时)**:...
在深入探讨Object-C的消息机制之前,首先我们要理解的是,...通过理解`Class`、`SEL`和`IMP`,我们可以更深入地了解如何在Objective-C中进行方法调用和动态绑定,这对于编写高效和可扩展的Objective-C代码至关重要。
在OC中,`SEL`(选择器)代表一个方法名,而`IMP`(实现指针)则指向方法的实际实现。当我们谈论动态添加方法时,实际上就是为一个类注册一个新的`SEL`,并提供对应的`IMP`。 3. **动态添加方法的基本步骤** - ...
BCM5396评估板提供了丰富的接口选项,包括MII/GMII接口、串行LED接口、SPI/EEPROM接口、WS接口和IMP接口等。通过深入分析这些接口和信号的功能,可以更好地理解BCM5396的工作原理,并为其在实际应用中的优化提供指导...
- 调用IMP可以直接执行对应的方法实现,如`void (*func)(id, SEL)`,其中`id`是对象指针,`SEL`是选择子。 5. **方法的类型编码(Method Type Encoding)** - 类型编码是每个方法的参数类型和返回值类型的ASCII...
在iOS和Mac OS X开发中,Objective-C作为主要的编程语言,提供了一种独特且强大的特性——方法交换(Method Swizzling)。它允许我们在运行时修改类的方法实现,这一特性在调试、AOP(面向切面编程)以及插件化开发...
**6.2 如何通过指定的 SEL 获取 IMP?** 可以使用 `class_getMethodImplementation` 函数来获取方法的 IMP。 **6.3 如何通过指定的 IMP 发送消息?** 可以通过 `objc_msgSend` 函数来实现。 **6.4 如何将 IMP ...
在runtime中,每个方法都是一个结构体,包含了SEL(selector)、IMP(实现指针)和其他信息。`method_copyArgumentType`和`method_copyReturnType`可以获取方法的参数类型和返回类型,`method_...
需要注意的是,方法的实现必须提供,通常通过IMP(函数指针)完成。 8. **访问类的变量、属性、方法**:runtime提供了许多API用于访问和操作类、属性和方法。例如,`class_getInstanceVariable()`用于获取实例变量...
H1_CountImp:=Imp这样的方式访问结构成员。 2. 替代Set/Reset指令:在SCL中,不需要专门的Set/Reset指令。可以通过条件语句实现相同的功能。例如,`IF THEN Variable name:=1; END_IF;`表示置位,而添加Else部分,...
本文将深入探讨如何利用Runtime机制给已有的类添加对象属性和非对象属性。 首先,理解Runtime机制是关键。Objective-C的Runtime系统是其动态特性的基础,它允许在程序运行过程中动态地获取类的信息、改变类的行为,...
通过Objective-C的Runtime API,我们可以获取方法的SEL(选择器)和IMP(实现),然后交换它们,达到在不修改原有代码的情况下注入额外功能的目的。 以下是一个简单的Method Swizzling示例: ```objc // 创建一个...
IMP newImp = imp_implementationWithBlock(^{ // 新的实现 }); BOOL isMethodExist = class_replaceMethod([SomeClass class], selector, newImp, "@@:"); if (!isMethodExist) { NSLog(@"Failed to replace ...
5. **类方法中的SEL与IMP**: - 在类方法中,可以使用`self`配合`@selector()`获取类方法的SEL,然后通过`class_getClassMethod()`获取对应的IMP(实现)。 - 这种方式常用于动态方法解析,如`...
方法选择器(SEL)是方法的唯一标识,IMP是方法实现的指针。在runtime中,可以使用`sel_registerName`注册新的选择器,`methodForSelector:`获取对应选择器的方法实现。 8. **元类(Meta-class)** 元类是Objective...