在objective-c中当我们向一个对象发送消息的时候,如果处理消息的方法不存在,通常都会导致程序的崩溃。但是runtime编程可以让程序继续执行。下面我们来看一段代码。
动态的为对象增加方法
void dynamicMethodIMP(id self, SEL _cmd) { printf("SEL %s did not exist\n",sel_getName(_cmd)); } + (BOOL) resolveInstanceMethod:(SEL)aSEL { if (aSEL == @selector(t)) { class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:"); return YES; } return [super resolveInstanceMethod:aSEL]; }
当对象不能接受某个selector时,会触发resolveInstanceMethod函数,我们可以在这个函数中向对象所属的类动态添加所需的selector:
如果我们在上面的函数中不做任何处理
@implementation CA void dynamicMethodIMP(id self, SEL _cmd) { printf("SEL %s did not exist\n",sel_getName(_cmd)); } + (BOOL) resolveInstanceMethod:(SEL)aSEL { return YES; } - (id)forwardingTargetForSelector:(SEL)aSelector { if (aSelector == @selector(uppercaseString)) { return @"hello world"; } } 测试代码 : a = [[CA alloc]init]; NSLog(@"%@",[a performSelector:@selector(uppercaseString)];
由于运行时找不到函数,最终触发forwardingTargetForSelector函数,该函数处理后返回一个字符串,因此uppercaseString消息将被返回的字符串对象处理。最终打印结果为大写的hello world
相关推荐
在Objective-C中,消息是一种向对象发送请求的方式。消息传递机制是Objective-C的核心概念之一。当一个对象接收到消息时,实际上是调用了对象的一个方法。Objective-C中的消息传递是动态的,可以在运行时确定接收者...
内存管理在Objective-C中是一个重要方面,特别是在处理对象所有权和责任时。为了避免强引用循环,需要合理使用strong和weak属性来管理对象的生命周期。 8. 消息传递和方法调用 在Objective-C中,对象之间通过发送...
2. **消息传递**:Objective-C中的对象通过发送消息来交互。消息传递是Objective-C的核心概念,它类似于其他语言中的方法调用,但更灵活,因为可以动态决定接收者和选择器。 3. **类与对象**:类是创建对象的蓝图,...
6. categories:Objective-C的类别机制允许向已存在的类添加新的方法,而无需修改原有代码,这是Objective-C的一个强大特性。 7. blocks:Blocks是Objective-C的匿名函数,可以捕获和存储当前作用域内的变量。它们...
当你调用一个对象的方法时,实际上是向该对象发送一条消息。对象根据接收到的消息决定执行哪个方法。这种设计使代码更加灵活和动态。 6. categories 和 protocols:Objective-C的categories允许你在不修改原有类...
在Objective-C中,方法调用是通过向对象发送消息来完成的,而不是像C++那样直接调用成员函数。这种消息传递机制使得Objective-C的代码风格非常独特。 Objective-C的消息传递使用中括号表示法,例如,对象obj调用一...
Objective-C的一个独特特性是类簇(Class Clusters),它允许库定义对象创建的语义,使得当向对象发送`-init`消息时,返回的可能是与原始对象类型不同的初始化对象。这种设计提高了效率,允许不同数据类型的子类提供...
当你调用一个对象的方法时,实际上是向该对象发送一条消息。例如,`[myObject sayHello];`就是向`myObject`发送一个`sayHello`消息。这种动态的消息传递使得Objective-C具有很高的灵活性和可扩展性。 在Objective-C...
这意味着当你调用一个对象的方法时,实际上是向该对象发送了一个消息,请求执行某个操作。这种方式更接近于真实世界的交互模型,也为语言本身带来了一定的灵活性。 ##### 3. 与C语言的兼容性 Objective-C的一个重要...
当调用对象的方法时,实际上是在向对象发送一条消息。例如,`[anObject doSomething]`就是一个消息。 4. **属性(Properties)**:Objective-C提供了属性语法来封装对象的数据。属性提供了自动内存管理(如retain、...
- **消息传递**: 向对象发送消息来调用其方法,例如: ```objective-c [person sayHello]; ``` #### 五、Objective-C与C/C++的互操作性 由于Objective-C是从C语言扩展而来的,因此它可以无缝地与其他C/C++代码...
Objective-C通过发送消息来调用对象的方法,这与C++或Java中的函数调用有所不同。例如,`[anObject doSomething:]` 是向anObject发送一个doSomething消息。消息传递是Objective-C的精髓,它提供了高度的灵活性和动态...
- 消息传递(Message Passing)是通过点语法(如 `object.method`)向对象发送请求,执行相应的方法。 - 协议(Protocols)类似接口,定义了一组方法签名,允许类遵循多个协议,实现多态性。 - 动态类型(Dynamic...
首先,"Programming In Objective-C.chm" 是一本关于Objective-C编程的电子书,可能涵盖了语言的基本语法、类和对象的概念、消息传递机制、内存管理(在Objective-C中是ARC,即自动引用计数)、类别、协议、 Blocks...
1. **Objective-C的起源与特性**:Objective-C是在C语言的基础上扩展的,增加了消息传递机制和面向对象特性。它的语法包含C语言的所有部分,同时引入了类、继承、多态等OOP概念。 2. **类与对象**:在Objective-C中...
Objective-C2.0是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,融合了Smalltalk的动态特性,广泛应用于iOS和Mac OS X操作系统。本资料集中的"Objective-C2.0程序设计习题官方答案"显然是针对学习...
C++类可以在Objective-C中作为对象使用,但它们不是Objective-C的对象,不能直接发送消息。需要使用`@interface`定义一个桥接接口,让C++类遵循Objective-C协议,或者使用Objective-C++(`.mm`文件)来处理转换。 ...
在Objective-C中,对象通过发送消息来执行操作,这种机制类似于其他语言中的方法调用。消息传递的关键在于选择正确的接收者(对象)和正确的方法(消息)。 Objective-C的类定义是基于接口(Interface)和实现...