ios开发nil检查、BOOL类型陷阱

nil检查

  仅在校验逻辑流程时做nil检查。

  使用nil检查不是为了防止程序崩溃,而是校验逻辑流程。向一个空对象发送一条消息是由Objective-C运行时处理的。方法没有返回结果,你也可以安心走下去.然而这里也有一种.

  注意这里和C/C++的空指针检查是完全不同的,在那些环境里,并不处理空指针情况并可能导致你的应用程序崩溃。不过你仍要自己确保提领的指针不为空。

  BOOL类型陷阱

  整形的转换为BOOL型的时候要小心。不要直接和YES做比较。

  BOOL在Objective-C里被定义为unsignedchar,这意味着它不仅仅只有YES(1)和NO(0)两个值。不要直接把整形强制转换为BOOL型。常见的错误发生在把数组大小,指针的值或者逻辑位运算的结果赋值到BOOL型中,而这样就导致BOOL值的仅取决于之前整形值的最后一个字节,有可能出现整形值不为0但被转为NO的情况。应此把整形转为BOOL型的时候请使用ternery操作符,保证返回YES或NO值。

  在BOOL,_BOOL以及bool(见C++Std4.7.4,4.12以及C99Std6.3.1.2)之间可以安全的交换值或转型。但BOOL和Boolean之间不可,所以对待Boolean就像上面讲的整形一样就可以了。在Objective-C函数签名里仅使用BOOL。

  对BOOL值使用逻辑运算(&&,||,!)都是有效的,返回值也可以安全的转为BOOL型而不需要ternery操作符。

  代码

    // AVOID
      - (BOOL)isBold {
      return [self fontTraits] & NSFontBoldTrait;
      }
      - (BOOL)isValid {
      return [self stringValue];
      }
      // GOOD
      - (BOOL)isBold {
      return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
      }
      - (BOOL)isValid {
      return [self stringValue] != nil;
      }
      - (BOOL)isEnabled {
      return [self isValid] && [self isBold];
      }

还有,不要把BOOL型变量直接与YES比较。这样不仅对于精通C的人很有难度,而且此条款的第一点也说明了这样做未必能得到你想要的结果。

  代码

      // AVOID
      BOOL great = [foo isGreat];
      if (great == YES)
      // ...be great!
      // GOOD
      BOOL great = [foo isGreat];
      if (great)
      // ...be great!


你可能感兴趣的:(iOS错误)