admin管理员组

文章数量:1530842

我们在写一个方法时,如果希望在方法执行出错时,获取一个NSError对象,我们通常会像下面这样来定义我们的方法

1 2 3 4 5 6 7 + (NSString )checkStringLength:(NSString *)str error:(NSError **)error {    if  (str.length <= 0) {            *error = [NSError errorWithDomain:@ "ErrorDomain"  code:-1 userInfo:nil];        return  nil;    }    return  str; }

这段代码看着没啥问题,至少在语法上是OK的,所以在编译时,编译器并不会报任何警告。

如果我们用以下方式去调用的话,也是一切正常的:

1 2 NSError *error = nil; [Test checkStringLength:@ ""  error:&error];

不过我们如果就静态分析器来分析一下,发现会在”*error = …“这行代码处报如下的警告:

1 Potential  null  dereference. According to coding standards  in  ‘Creating and Returning NSError Objects’ the parameter may be  null

这句话告诉我们的是这里可能存在空引用。实际上,如果我们像下面这样调用方法的话,程序是会崩溃的:

1 [Test checkStringLength:@ ""  error:NULL];

因为此时在方法中,error实际上是NULL,*error这货啥也不是,对它赋值肯定就出错了。

这里正确的姿式是在使用error之前,先判断它是否为NULL,完整的代码如下:

1 2 3 4 5 6 7 8 9 + (NSString )checkStringLength:(NSString *)str error:(NSError **)error {      if  (str.length <= 0) {          if  (error != NULL) {              *error = [NSError errorWithDomain:@ "ErrorDomain"  code:-1 userInfo:nil];          }          return  nil;      }      return  str; }

实际上,对此这种方式的传值,我们始终需要去做非空判断。


本文标签: 静态potentialdereferencenull