设为首页收藏本站language 语言切换
查看: 1103|回复: 0
收起左侧

iOS开发中<null>的处理 南京iOS培训分享

[复制链接]
发表于 2016-8-15 18:14:09 | 显示全部楼层 |阅读模式
  在iOS开发过程中经常需要与服务器进行数据通讯,JSON就是一种常用的高效简洁的数据格式。下面南京万和iOS培训教大家处理iOS开发中<null>。

  问题:

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

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

  -[NSNull length]: unrecognized selector sent to instance

  解决方案:

  用了一个Category,叫做NullSafe 。

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

  NullSafe 源码:

  #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 *)methodSignatureForSelectorSEL)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;

  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)forwardInvocationNSInvocation *)invocation

  {

  invocation.target = nil;

  [invocation invoke];

  }

  #endif

  @end

  想和兴趣相投的朋友们一起交流吗?那就来江苏万和计算机培训中心吧。而江苏万和作为南京专业的iOS培训中心,欢迎广大有志于此行业发展的学员们加入。

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-2-2 16:52 , Processed in 0.061941 second(s), 14 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表