objc - 接收任何消息的NSNull

动机

无论出于容错的目的,还是偷懒的目的,你都想你的NSNull的对象接受一切消息而不Crash了,就如你发消息给nil一样。那么,就写个NSNull (FilterMessages)的Category,简单又直接,引入项目里头就好了。

源码

NSNull+FilterMessages.h:

#import <Foundation/Foundation.h>

@interface NSNull (FilterMessages)

@end

NSNull+FilterMessages.m:

#import "NSNull+FilterMessages.h"

@implementation NSNull (FilterMessages)

- (id)forwardingTargetForSelector:(SEL)aSelector {
    return nil;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    return [NSNull instanceMethodSignatureForSelector:@selector(description)];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    id temp = nil;
    [anInvocation invokeWithTarget:temp];
}

@end

测试

main.mmain函数里加入代码,运行一下看看:

NSDictionary *obj = (NSDictionary *)[NSNull null];  // 欺骗一下编译器
id value = [obj objectForKey:@"anything"];  // 发消息给NSNull单例对象

好的,没Crash。

原理

先贴两个Reference,你们仔细看看,然后我再罗嗦一句:

Objective-C 消息发送与转发机制原理 (这位博主看来是个逆向高手啊:P)
StackOverflow: Objective-C respondsToSelector(时间紧的同学就看这个参考吧)

罗嗦一句:利用Objective-C的消息转发机制,把所有NSNull对象所有不处理的消息全部转发给了nil

恩,如果觉得文章帮到了您,请我吃根卫龙辣条吧 :)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值