NSString未初始化时检查“空”NSString是否崩溃

时间:2011-10-15 00:57:06

标签: objective-c

我有一种方法,我想确保在遇到“空”字符串时做一些特别的事情。当它实际上有一个字符串,或者当我专门将它设置为“nil”或“NULL”时,它工作得很好,但是当我尝试测试未初始化的NSString时它会崩溃。我该如何处理这种情况?

例如:

-(void) WhyDoICrash
{
  NSString *foo;

  // Some other stuff...

  // foo should be considered "empty"
  if (foo == nil || foo == NULL || [foo length] == 0)
  {
    // whatever
  }
}

=============编辑===================

好的,上面只是一个显示问题的非常简单的例子。我实际上正在使用NSString的类别,这意味着我得到的一些(好的,但不适用)建议无法使用。这是我的确切代码:

#pragma mark - NSString Category

@interface NSString (NullOrEmptyTesting)
+(BOOL) isNullOrEmpty: (NSString*)input;
@end

@implementation NSString (NullOrEmptyTesting)

+(BOOL) isNullOrEmpty: (NSString*)input
{
  return (input == (id)[NSNull null] || input.length == 0);
}

@end

2 个答案:

答案 0 :(得分:5)

  

(...)但是当我尝试测试未初始化的NSString时崩溃了。我该如何处理这种情况?

通过初始化相应的变量来处理它,例如

NSString *foo = nil;

在C和Objective-C中,automatic variables未初始化为0 - 您无法对该变量中包含的值进行任何假设。请参阅此问题:What happens to a declared, uninitialized variable in C? Does it have a value?

此外,

if (foo == nil || foo == NULL || [foo length] == 0)

相当于:

if (foo == nil || [foo length] == 0)

并且,从Objective-C supports messaging nil objects开始,通常会测试:

if ([foo length] == 0)

请注意,在分配实例时,Objective-C会将实例变量初始化为0。

答案 1 :(得分:0)

如果你正在进行AND比较,你就不会崩溃。

if ((foo != nil) && (foo != NULL) && ([foo length] > 0))
{
    // do something
}

你崩溃的原因是你正在进行的OR比较会评估所有内容(包括[foo length],每次)。在这种情况下,您正在向无效对象发送消息,因此崩溃。

进行AND比较时。一个成功的“foo == NULL”测试将停止评估其他所有内容(所以你不会进入 - 并崩溃 - [foo length])