NSNULL判空Category

从一开始做项目我就觉得服务器返回的数据很有问题,一般是这样的<null>。

返回的数据一空,程序就会crash。然后我也crash了。

问了许多人,没人碰到这种情况,好像他们的服务器没返回过<null>似的。

我国的大百度,搜点啥也特费劲。

我就一直很恶心的写了这样的代码:

if ([[[dic objectForKey:@"data"] objectForKey:@"nickname"] isEqual: [NSNull null]])

直到后来我发现了这样的代码:

#define NSNullObjects @[@"",@0,@{},@[]]

@interface NSNull (InternalNullExtention)
@end



@implementation NSNull (InternalNullExtention)


- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
    NSMethodSignature* signature = [super methodSignatureForSelector:selector];
    if (!signature) {
        for (NSObject *object in NSNullObjects) {
            signature = [object methodSignatureForSelector:selector];
            if (signature) {
                break;
            }
        }

    }
    return signature;
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL aSelector = [anInvocation selector];

    for (NSObject *object in NSNullObjects) {
        if ([object respondsToSelector:aSelector]) {
            [anInvocation invokeWithTarget:object];
            return;
        }
    }

    [self doesNotRecognizeSelector:aSelector];
}
@end

立马高大上了。

这个原理就是如果实例本身就有相应的response,那么就会相应之,如果没有系统就会发出methodSignatureForSelector消息,寻问它这个消息是否有效?有效就返回对应的方法地址之类的,无效则返回nil。如果是nil就会crash, 如果不是nil接着发送forwardInvocation消息。所以我们在重写methodSignatureForSelector的时候就人工让其返回有效实例。

看看我是怎么试的:

    NSDictionary * dict = (NSDictionary *)[NSNull null];
    
    NSString * objectForKey = [dict objectForKey:@"str"];
    
    NSLog(@"dict - %@",dict);
    
    NSLog(@"objectForKey - %@",objectForKey);

打印日志:

2014-09-05 11:04:47.151 createData[797:60b] dict - <null>
2014-09-05 11:04:47.152 createData[797:60b] objectForKey - (null)

以后导入这个Category就可以解决判空的问题了!!!!!

其实再深入想想,是不是可以将对象找不到的消息动态转移到其他消息上。我再研究研究。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值