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

gho*_*ron 3 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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

好的,上面只是一个显示问题的简单例子.我实际上正在使用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
Run Code Online (Sandbox Code Playgroud)

小智 5

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

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

NSString *foo = nil;
Run Code Online (Sandbox Code Playgroud)

在C和Objective-C中,自动变量不会初始化为0 - 您无法对该变量中包含的值进行任何假设.看到这个问题:C中声明的未初始化变量会发生什么?它有价值吗?

也,

if (foo == nil || foo == NULL || [foo length] == 0)
Run Code Online (Sandbox Code Playgroud)

相当于:

if (foo == nil || [foo length] == 0)
Run Code Online (Sandbox Code Playgroud)

并且,由于Objective-C支持消息传递nil对象,因此测试通常是:

if ([foo length] == 0)
Run Code Online (Sandbox Code Playgroud)

只要.

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