jswanho 发表于 2016-8-15 18:14:09

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

  在iOS开发过程中经常需要与服务器进行数据通讯,JSON就是一种常用的高效简洁的数据格式。下面南京万和iOS培训教大家处理iOS开发中<null>。
  问题:
  在项目中,一直遇到一个坑的问题,程序在获取某些数据之后莫名崩溃。原因是:由于服务器的数据库中有些字段为空,然后以JSON形式返回给客户端时就会出现这样的数据:repairs = "<null>"
  这个数据类型不是nil 也不是 String。 解析成对象之后,如果直接向这个对象发送消息(eg:length,count 等等)就会直接崩溃。提示错误为:
  -: 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 *)methodSignatureForSelector:(SEL)selector
  {
  @synchronized()
  {
  //look up method signature
  NSMethodSignature *signature = ;
  if (!signature)
  {
  //not supported by NSNull, search other classes
  static NSMutableSet *classList = nil;
  static NSMutableDictionary *signatureCache = nil;
  if (signatureCache == nil)
  {
  classList = [ init];
  signatureCache = [ 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 = ;
  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 == )
  {
  ;
  break;
  }
  ;
  superclass = class_getSuperclass(superclass);
  }
  }
  //remove all classes that have subclasses
  for (Class someClass in excluded)
  {
  ;
  }
  //free class list
  free(classes);
  }
  //check implementation cache first
  NSString *selectorString = NSStringFromSelector(selector);
  signature = signatureCache;
  if (!signature)
  {
  //find implementation
  for (Class someClass in classList)
  {
  if ()
  {
  signature = ;
  break;
  }
  }
  //cache for next time
  signatureCache = signature ?: ;
  }
  else if (])
  {
  signature = nil;
  }
  }
  return signature;
  }
  }
  - (void)forwardInvocation:(NSInvocation *)invocation
  {
  invocation.target = nil;
  ;
  }
  #endif
  @end
  想和兴趣相投的朋友们一起交流吗?那就来江苏万和计算机培训中心吧。而江苏万和作为南京专业的iOS培训中心,欢迎广大有志于此行业发展的学员们加入。
页: [1]
查看完整版本: iOS开发中<null>的处理 南京iOS培训分享