`

objective-c中向一个对象发送不存在的消息。

    博客分类:
  • ios7
 
阅读更多

在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 2.0 运行时系统编程指南

    在Objective-C中,消息是一种向对象发送请求的方式。消息传递机制是Objective-C的核心概念之一。当一个对象接收到消息时,实际上是调用了对象的一个方法。Objective-C中的消息传递是动态的,可以在运行时确定接收者...

    Programming With Objective-C

    内存管理在Objective-C中是一个重要方面,特别是在处理对象所有权和责任时。为了避免强引用循环,需要合理使用strong和weak属性来管理对象的生命周期。 8. 消息传递和方法调用 在Objective-C中,对象之间通过发送...

    Objective-C编程全解最新版.pdf.zip

    2. **消息传递**:Objective-C中的对象通过发送消息来交互。消息传递是Objective-C的核心概念,它类似于其他语言中的方法调用,但更灵活,因为可以动态决定接收者和选择器。 3. **类与对象**:类是创建对象的蓝图,...

    这是一个基于Objective-C语言的基础案例集 旨在用于给初学者快速了解Objective-C语言的语法 .zip

    6. categories:Objective-C的类别机制允许向已存在的类添加新的方法,而无需修改原有代码,这是Objective-C的一个强大特性。 7. blocks:Blocks是Objective-C的匿名函数,可以捕获和存储当前作用域内的变量。它们...

    objective-c 面向对象编程

    当你调用一个对象的方法时,实际上是向该对象发送一条消息。对象根据接收到的消息决定执行哪个方法。这种设计使代码更加灵活和动态。 6. categories 和 protocols:Objective-C的categories允许你在不修改原有类...

    Objective-C的语法与Cocoa框架.pdf

    在Objective-C中,方法调用是通过向对象发送消息来完成的,而不是像C++那样直接调用成员函数。这种消息传递机制使得Objective-C的代码风格非常独特。 Objective-C的消息传递使用中括号表示法,例如,对象obj调用一...

    Objective-C语言核心语法

    Objective-C的一个独特特性是类簇(Class Clusters),它允许库定义对象创建的语义,使得当向对象发送`-init`消息时,返回的可能是与原始对象类型不同的初始化对象。这种设计提高了效率,允许不同数据类型的子类提供...

    Objective-C

    当你调用一个对象的方法时,实际上是向该对象发送一条消息。例如,`[myObject sayHello];`就是向`myObject`发送一个`sayHello`消息。这种动态的消息传递使得Objective-C具有很高的灵活性和可扩展性。 在Objective-C...

    Objective-C Objective-C 是一种面向对象的编程语言,主要用于苹果的 macOS 和 iOS 操作系统的应

    这意味着当你调用一个对象的方法时,实际上是向该对象发送了一个消息,请求执行某个操作。这种方式更接近于真实世界的交互模型,也为语言本身带来了一定的灵活性。 ##### 3. 与C语言的兼容性 Objective-C的一个重要...

    基于Objective-C的面向对象编程

    当调用对象的方法时,实际上是在向对象发送一条消息。例如,`[anObject doSomething]`就是一个消息。 4. **属性(Properties)**:Objective-C提供了属性语法来封装对象的数据。属性提供了自动内存管理(如retain、...

    objective-c基础教程

    - **消息传递**: 向对象发送消息来调用其方法,例如: ```objective-c [person sayHello]; ``` #### 五、Objective-C与C/C++的互操作性 由于Objective-C是从C语言扩展而来的,因此它可以无缝地与其他C/C++代码...

    好学的Objective-c(高清版)PDF

    Objective-C通过发送消息来调用对象的方法,这与C++或Java中的函数调用有所不同。例如,`[anObject doSomething:]` 是向anObject发送一个doSomething消息。消息传递是Objective-C的精髓,它提供了高度的灵活性和动态...

    学习Objective-C--第一天.doc

    - 消息传递(Message Passing)是通过点语法(如 `object.method`)向对象发送请求,执行相应的方法。 - 协议(Protocols)类似接口,定义了一组方法签名,允许类遵循多个协议,实现多态性。 - 动态类型(Dynamic...

    Objective-C.2.0 中文版.pdf & Objective-C.chm

    首先,"Programming In Objective-C.chm" 是一本关于Objective-C编程的电子书,可能涵盖了语言的基本语法、类和对象的概念、消息传递机制、内存管理(在Objective-C中是ARC,即自动引用计数)、类别、协议、 Blocks...

    这是一个基于Objective-C语言的基础案例集。旨在用于给初学者快速了解Objective-C语言的语法。.zip

    1. **Objective-C的起源与特性**:Objective-C是在C语言的基础上扩展的,增加了消息传递机制和面向对象特性。它的语法包含C语言的所有部分,同时引入了类、继承、多态等OOP概念。 2. **类与对象**:在Objective-C中...

    Objective-C2.0程序设计习题官方答案

    Objective-C2.0是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,融合了Smalltalk的动态特性,广泛应用于iOS和Mac OS X操作系统。本资料集中的"Objective-C2.0程序设计习题官方答案"显然是针对学习...

    在Objective-C中使用C++

    C++类可以在Objective-C中作为对象使用,但它们不是Objective-C的对象,不能直接发送消息。需要使用`@interface`定义一个桥接接口,让C++类遵循Objective-C协议,或者使用Objective-C++(`.mm`文件)来处理转换。 ...

    Objective-C程序设计

    在Objective-C中,对象通过发送消息来执行操作,这种机制类似于其他语言中的方法调用。消息传递的关键在于选择正确的接收者(对象)和正确的方法(消息)。 Objective-C的类定义是基于接口(Interface)和实现...

Global site tag (gtag.js) - Google Analytics