当前位置 > 主页 > 万和大讲堂 >


南京iOS培训分享 :iOS开发中的处理

2016-08-12 14:53

  在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 *)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培训中心,欢迎广大有志于此行业发展的学员们加入。

最近开班 more>
  • 全栈开发
  • 前端基础班
  • 软件测试
  • Java大数据开发工程师
  • 云原生精英班
  • 开发课程基础班第四期
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第一期
  • Java Web UI Python
  • CISP
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCM 12C
  • OCP 19C
  • RHCE 9.0
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • vip班
  • 考试计划
  • 脱产班
  • 脱产班
  • 脱产班
  • 双休班
  • 双休班
  • 双休班
  • 双休班
  • 业余班
  • 业余班
  • 10月16日
  • 9月23日
  • 9月2日
  • 9月30日
  • 8月26日
  • 10月8日
  • 9月23日
  • 9月16日
  • 9月9日
  • 随时开课
  • 9月21日
  • 10月17日
  • 9月18日
  • 9月2日
  • 11月2日
  • 10月26日
  • 9月7日
  • ——
  • 随时开课
  • 9月26日
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入