高效编写代码-消息转发

深入了解runtime

NSInvocation介绍

NSHipster-Swizzling

Objective-C Method相关方法分析

Type Encodings

推荐阅读高效编写代码-消息转发

在这里,我只针对一个经常出现的Crash给出利用消息转发处理的方案。

应用:处理Crash : unrecognized selector send to instance

@implementation NSObject (Swizzling)

+ (BOOL)lv_swizzlingInstanceOringnalSel:(SEL)orignalSel AletSel:(SEL)aletSel {

    if (!orignalSel || !aletSel) {
return NO;
} Class cls = [self class]; Method orignalMethod = class_getInstanceMethod(cls, orignalSel);
Method aletMethod = class_getInstanceMethod(cls, aletSel); BOOL addAletMethod = class_addMethod(cls, aletSel,
method_getImplementation(aletMethod),
method_getTypeEncoding(aletMethod));
if (addAletMethod) {
class_replaceMethod(cls, aletSel,
method_getImplementation(orignalMethod),
method_getTypeEncoding(orignalMethod));
}else {
method_exchangeImplementations(orignalMethod, aletMethod);
}
return YES;
} + (BOOL)lv_swizzlingClassOrignalSel:(SEL)orignalSel AletSel:(SEL)aletSel {
return [object_getClass((id)self) lv_swizzlingInstanceOringnalSel:orignalSel AletSel:aletSel];
} @end @implementation NSNull (NilSafe) + (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self lv_swizzlingInstanceOringnalSel:@selector(methodSignatureForSelector:) AletSel:@selector(lv_methodSignatureForSelector:)];
[self lv_swizzlingInstanceOringnalSel:@selector(forwardInvocation:) AletSel:@selector(lv_forwardInvocation:)];
});
} - (NSMethodSignature *)lv_methodSignatureForSelector:(SEL)aSelector {
NSMethodSignature * sign = [self lv_methodSignatureForSelector:aSelector];
if (sign) {
return sign;
}
return [NSMethodSignature signatureWithObjCTypes:@encode(void)];
} - (void)lv_forwardInvocation:(NSInvocation *)anInvocation {
return;
} @end

iOS - 消息转发处理的更多相关文章

  1. iOS消息转发机制

    iOS消息转发机制 “消息派发系统”(message-dispatch system) 若想令类能够理解某条消息,我们必须实现出对应的方法才行.但是,在编译器向类发送其无法解读的消息时并不会报错,因为 ...

  2. iOS 消息转发机制

    这篇博客的前置知识点是 OC 的消息传递机制,如果你对此还不了解,请先学习之,再来看这篇.这篇博客我尝试用口语的方式像讲述 PPT 一样给大家讲述这个知识点. 我们来思考一个问题,如果对象在收到无法解 ...

  3. iOS 消息转发以及 NSProxy 实战

    最后更新: 2018-01-17 一.消息派发机制-NSObject 在 iOS 开发中, 调用对象的方法就是给对象发送一个消息.了解消息的派发机制对于iOS开发来说是一个很实用且强大的工具, 下面我 ...

  4. iOS消息转发

    消息转发是一种功能强大的技术,可以大大增加Objective-C的表现力.什么是消息转发?简而言之,它允许未知的消息被困住并作出反应.换句话说,无论何时发送未知消息,它​​都会以一个很好的包发送到您的 ...

  5. ios 消息转发初探

    有时候服务器的接口文档上一个数据写的是string类型,这时候你就会直接把它赋值给一个label. 问题来了,有时候这个string的确是string,没有问题,有时候又是NSNumber,当然不管三 ...

  6. iOS 消息转发

    消息转发   delegate和protocol   类别      消息转发   当向someObject发送某消息,但runtime system在当前类和父类中都找不到对应方法的实现时,runt ...

  7. iOS的消息转发机制详解

    iOS开发过程中,有一类的错误会经常遇到,就是找不到所调用的方法,当然这类问题比较好解决,给当前对象或其父类对象添加该方法即可,使得编译器在编译时能正确找到该方法:或者,还有另外的方法,由于Objec ...

  8. iOS 消息发送与转发详解

    Objective-C 是一门动态语言,它将很多静态语言在编译和链接时期做的事情,放到了运行时来处理.之所以能具备这种特性,离不开 Runtime 这个库.Runtime 很好的解决了如何在运行时期找 ...

  9. iOS Runtime的消息转发机制

    前面我们已经讲解Runtime的基本概念和基本使用,如果大家对Runtime机制不是很了解,可以先看一下以前的博客,会对理解这篇博客有所帮助!!! Runtime基本概念:https://www.cn ...

随机推荐

  1. JS正则表达式(JavaScript regular expression)

    RegExp直接量和对象的创建 就像字符串和数字一样,程序中每个取值相同的原始类型直接量均表示相同的值,这是显而易见的.程序运行时每次遇到对象直接量(初始化表达式)诸如{}和[]的时候都会创建新对象. ...

  2. 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序

    物联网(IoT)技术方兴未艾,智能手环,智能血压计,智能眼镜甚至智能鞋垫都开始进入我们的生活,各种智能设备层出不穷,世界已经到了一个"人有多大胆,地有多大产"的时代,不玩儿点物联网 ...

  3. 利用github pages创建简单的网站

    github.com 作为最流行的源代码管理工具已经风靡全球,同时在依托于github也衍生出了各种各样的应用,比如可以利用github搭建博客系统等等. 先换个话题,我们每人手头都或多或少有些&qu ...

  4. An App ID with Identifier 'com.XXX.XXX’ is not available. Please enter a different string.报错

    昨天刚刚升的Xcode7.3和iOS9.3,然后没怎么使用这两样就下班了,但是今天早上来了之后,就发现突然之间不能真机测试和运行代码了,一看才发现xcode报错: An App ID with Ide ...

  5. 原创:jar的名字可能影响maven的依赖下载

    自己定义了phoenix4.6-client的依赖关系POM,如下: <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  6. JavaScript & PHP模仿C#中string.format效果

    1.JavaScript function stringformat() { var args = Array.prototype.slice.call(arguments); if (args.le ...

  7. Web系统性能测试术语简介

    并发用户 并发一般分为两种情况.一种是严格意义上的并发,即所有的用户在同一时刻做同一件事情或者操作.这种操作一般指做同一类型的业务,比如在信用卡审批业务中,一定数目的用户在同一时刻对已经完成的审批业务 ...

  8. Git各大平台(win/Linux/Mac)图形化界面客户端大汇总

    摘要: 介绍各平台下的图形化界面git客户端(本人并没有全部使用过),欢迎大家补充新的软件或者使用感受~  一.TortoiseGit - The coolest Interface to Git V ...

  9. 搭建基于PHP的www服务器

    安装MySQL #!/bin/bash mount |grep "/dev/sr0" if [ "$?" != 0 ];then mount /dev/sr0 ...

  10. 安装Appium-windows

    安装Appium-windows JDK 安装JDK后设置 环境变量,把环境变量添加到你的系统PATH变量中. 变量: JAVA_HOME 值: C:\Program Files (x86)\Java ...