星空网 > 软件开发 > 操作系统

iOS之数据解析时null的处理

在iOS开发过程中经常需要与服务器进行数据通讯,JSON就是一种常用的高效简洁的数据格式。

问题:

在项目中,一直遇到一个坑的问题,程序在获取某些数据之后莫名崩溃。原因是:由于服务器的数据库中有些字段为空,然后以JSON形式返回给客户端时就会出现这样的数据:repairs = "<null>"

这个数据类型不是nil 也不是 String。 解析成对象之后,如果直接向这个对象发送消息(eg:length,count 等等)就会直接崩溃。提示错误为:

-[NSNull length]: unrecognized selector sent to instance

解决方案:

用了一个Category,叫做NullSafe 。

NullSafe思路:在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做,很简单。

NullSafe 源码:

iOS之数据解析时null的处理images/loading.gif' data-original="http://common.cnblogs.com/images/copycode.gif" >
#import <objc/runtime.h>#import <Foundation/Foundation.h>#ifndef NULLSAFE_ENABLED#define NULLSAFE_ENABLED 1#endif#pragma GCC diagnostic ignored "-Wgnu-conditional-omitted-operand"@implementation NSNull (NullSafe)#if NULLSAFE_ENABLED- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector{  @synchronized([self class])  {    //look up method signature    NSMethodSignature *signature = [super methodSignatureForSelector:selector];    if (!signature)    {      //not supported by NSNull, search other classes      static NSMutableSet *classList = nil;      static NSMutableDictionary *signatureCache = nil;      if (signatureCache == nil)      {        classList = [[NSMutableSet alloc] init];        signatureCache = [[NSMutableDictionary alloc] init];                //get class list        int numClasses = objc_getClassList(NULL, 0);        Class *classes = (Class *)malloc(sizeof(Class) * (unsigned long)numClasses);        numClasses = objc_getClassList(classes, numClasses);                //add to list for checking        NSMutableSet *excluded = [NSMutableSet set];        for (int i = 0; i < numClasses; i++)        {          //determine if class has a superclass          Class someClass = classes[i];          Class superclass = class_getSuperclass(someClass);          while (superclass)          {            if (superclass == [NSObject class])            {              [classList addObject:someClass];              break;            }            [excluded addObject:NSStringFromClass(superclass)];            superclass = class_getSuperclass(superclass);          }        }        //remove all classes that have subclasses        for (Class someClass in excluded)        {          [classList removeObject:someClass];        }        //free class list        free(classes);      }            //check implementation cache first      NSString *selectorString = NSStringFromSelector(selector);      signature = signatureCache[selectorString];      if (!signature)      {        //find implementation        for (Class someClass in classList)        {          if ([someClass instancesRespondToSelector:selector])          {            signature = [someClass instanceMethodSignatureForSelector:selector];            break;          }        }                //cache for next time        signatureCache[selectorString] = signature ?: [NSNull null];      }      else if ([signature isKindOfClass:[NSNull class]])      {        signature = nil;      }    }    return signature;  }}- (void)forwardInvocation:(NSInvocation *)invocation{  invocation.target = nil;  [invocation invoke];}#endif@end
iOS之数据解析时null的处理

详细的请去Github上查看:

https://github.com/nicklockwood/NullSafe

 




原标题:iOS之数据解析时null的处理

关键词:IOS

IOS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

AliExpress联合菜鸟升级中东物流服务,商家订单大涨40%:https://www.ikjzd.com/articles/1693889544448221185
海外电商广告投放,如何打造吸睛广告素材实现爆单:https://www.ikjzd.com/articles/1693892050377089025
探索DTC品牌出海营销策略:挑战与机遇:https://www.ikjzd.com/articles/1693907036264570881
新季、新品、新机遇—秋冬热门时尚配件上新解析:https://www.ikjzd.com/articles/1693908820701847554
亚马逊A10算法解析:用算法获得更高排名,获取更多优质流量!:https://www.ikjzd.com/articles/1693911633230143489
2023亚马逊广告开箱盛典发布最新出海趋势和营销洞察,赋能出海企业成就全球品牌:https://www.ikjzd.com/articles/1693913944786575362
TikTok 将推出先买后付服务 :https://www.goluckyvip.com/news/188219.html
深圳有没有比较好玩的景点 深圳有没有比较好玩的景点推荐一下:https://www.vstour.cn/a/366175.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流