`

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

分享到:
评论

相关推荐

    rust-objc:Rust的Objective-C运行时绑定和包装

    Objective-C对象发送消息msg_send! 巨集: let cls = class! (NSObject); let obj: * mut Object = msg_send! [cls, new]; let hash: usize = msg_send! [obj, hash]; let is_kind: BOOL = msg_send! [obj, ...

    C和Object混合编程的案例

    在 Objective-C 中,对象之间的通信和交互是通过发送消息来实现的。Objective-C 在语法上有一些独特的特点,比如方法调用使用方括号`[]`,消息接收者在方括号内部,方法名和参数则写在方括号内,如 `[object ...

    PMKVObserver:Swift和Objective-C的现代线程安全和类型安全键值观察

    这样可以防止在对象正在分配时在另一个线程上接收消息。 对Obj-C和Swift的一流支持,包括Swift API中的强类型化。 例子 Swift // Observe an object for as long as the object is alive. _ = KVObserver

    RHAddressBook:一个与iOS地址簿接口的Cocoa Objective-C库

    一个Cocoa / Objective-C库,用于与带有附加地理编码支持的iOS AddressBook接口。 各种对象上的所有属性都作为属性公开,从而允许使用简单的Obj-C代码。 (不再处理CF方法等) 内置对背景地理编码的支持,并带有...

    UsingDelegates:iOS Objective-C,实现委托设计模式

    答:1“委派是一种简单而强大的模式,其中应用程序中的一个对象代表另一个对象或与另一个对象协同工作。委派对象在适当的时候保留对另一个对象(委托)的引用。 ,委托对象将消息发送给委托人,该消息通知委托人...

    iOS消息发送和转发示例详解

    前言 ...在 Objective-C 中,方法调用称为向对象发送消息: // MyClass 类 @interface MyClass: NSObject - (void)printLog; @end @implementation MyClass - (void)printLog { NSLog(@print log !

    iOS开发中实现hook消息机制的方法探究

    在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。 每个类都有一个...

    rust-mac-app-examples:在Mac上的Cocoa应用中运行Rust的示例和模板

    :在Rust中创建一个自定义接口,以安全地(至少)访问Cocoa类(某种程度上),或者至少没有unsafe块的运行时中创建并注册一个Objective-C类,以及从Rust和Objective-C都向实例发送消息:在Rust中创建一个静态库,并...

    iOS中Runtime的几种基本用法记录

    Runtime 介绍 这不是一遍介绍关于Runtime实现细节的文章,而是怎么利用Objective-C提供的Runtime API...在OOP术语中,消息传递是指一种在对象之间发送和接收消息的通信模式。 在Objective-C中,消息传递用于在调用类和

    object c/iphone 开发 试题

    retain是通知编译器向分配给此属性的对象发送一个保留(retain)消息,确保属性的实例变量在被使用过程中不会被从内存中删除; nonatomic是 创建一个互斥访问,避免读和写不同步(非原子性访问); 通过这个属性声明...

    cocoa-amf:适用于服务器和客户端的Flash Remoting格式(AMF0AMF3)的Objective-C实现

    为了测试现有的AMF服务器,提供了一个更复杂的工具,即AMFClient,因此请务必将其签出! 如果要从Cocoa发送自定义类,请确保实现NSCoding协议。 您可以对键控和非键控进行编码,后者表示您正在对可类进行编码。 反...

    Objective C职责链模式设计源码

    职责链模式(Chain of Responsibility):使... 职责链模式的一个很重要的特点是,当客户发出请求之后,客户端并不知道哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。

    IOS编程入门-精品教程

    第一部分:Hello World!创建你的第一个iPhone App 第二部分:iOS编程基础:Hello World应用程序如何工作的?...第十五部分:Objective-C基础知识-介绍面向对象的编程 第十六部分:如何在你的iPhone App中发送邮件

    iOS中实现检测Zoombie对象的具体方法

    那么在一个对象释放后,再次给该对象发送消息,在Xcode控制台中,可看到如下打印信息。这些信息可以帮助我们定位问题。 ZoombieDemo[12275:2841478] *** -[Test test]: message sent to deallocated instance 0x...

    IOS App 无代码入侵的方法hook详细介绍

    于是App端在某些页面切换,交互操作的时候需要给统计系统发送一条消息 在几十个Controller 的项目里,一个一个地加代码那完全是不可能的,维护起来也是吃力 但这里需要处理的是 Controller, 可以有以下方式实现上述需求...

    JKWWebviewBridge:一个iOS桥,用于在iOS 8+的WKWebview中的Obj-C和JavaScript之间发送消息,并在UIView中包含进度条显示加载状态

    JKWWebview桥梁一个iOS桥,用于在iOS 8+的WKWebview中的Obj-C和JavaScript之间发送消息,并在UIView中包括进度条显示加载状态。设置要在自己的项目中使用JKWWebviewBridge,请执行以下操作: 导入框架...

    一步一步学习 iOS 6 编程(第四版)

    第十五部分:Objective-C 基础知识-介绍面向对象的编程 第十六部分:如何在你的 iPhone App 中发送邮件 第十七部分:持续改善 Recipe App 的详细视图控制器 第十八部分:在 iOS 5 中使用 JSON 编程 第十九部分:在.NET ...

    iOS 四种回调方法总结

    在Objective-C中,有四条途径可以实现回调。 目标-动作对 在程序开始定等待前,要求“当时间发生时,向指定的对象发送某个特定的信息”。这里接收消息的对象是目标,消息的选择器是动作。 辅助对象 在程序开始等待...

    Chomp:Mike Ash csv 端口被 > https 取代

    <TITLE>如何使用 Cocoa 高阶消息平台</TITLE> 如何使用 Cocoa 高阶消息... 假设您有一个对象数组,并且您想将 -step 消息发送到数组中的每个对象。 这在 Cocoa 中很简单: [array makeObjectsPerformSel

Global site tag (gtag.js) - Google Analytics