在Objective-C中检查空字符串的正确方法是什么?

时间:2009-06-09 08:13:49

标签: ios objective-c cocoa-touch

我在我的iPhone应用程序中使用它

if (title == nil) {
    // do something
}

但它抛出一些异常,控制台显示标题为“(null)”。

所以我现在正在使用它:

if (title == nil || [title isKindOfClass:[NSNull class]]) {
    //do something
}

有什么区别,确定字符串是否为空的最佳方法是什么?

20 个答案:

答案 0 :(得分:386)

正如其他人所指出的那样,在Cocoa / Objective C下有很多种类型的“null”。但还有一点要注意的是[title isKindOfClass:[NSNull class]]是无意义复杂的,因为[NSNull null]被记录在案成为单身人士,这样你就可以检查指针是否相等。请参阅Topics for Cocoa: Using Null

所以一个好的测试可能是:

if (title == (id)[NSNull null] || title.length == 0 ) title = @"Something";

请注意如何使用即使title为nil,title.length将返回0 / nil / false,在这种情况下为0,因此您不必特殊情况。这是Objective C新手的人难以习惯,特别是来自其他语言的消息/方法调用nil崩溃。

答案 1 :(得分:24)

就像

一样简单
if([object length] >0)
{
  // do something
}

请记住,在目标C中,如果object为null,则返回0作为值。

这将为您提供空字符串和0长度字符串。

答案 2 :(得分:6)

请参阅本网站上的以下相关文章:

我认为您的错误与其他内容有关,因为您不需要进行额外检查。

另请参阅此相关问题:Proper checking of nil sqlite text column

答案 3 :(得分:5)

所有这些“适合我的答案”是什么?我们都使用相同的语言进行编码,规则是

  1. 确保参考不是 nil
  2. 检查并确保字符串的长度不为0
  3. 这对所有人都有用。如果给定的解决方案仅“适合您”,那只是因为您的应用程序流不允许引用可能为null或字符串长度为0的情况。执行此操作的正确方法是将处理的方法在所有情况下你想要什么。

答案 4 :(得分:5)

我发现为了真正做到正确,你最终不得不做类似于

的事情
if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) {
}

否则你会遇到奇怪的情况,控制权仍会绕过你的支票。我没有遇到一个超过isEqual和长度检查的人。

答案 5 :(得分:4)

如果要对所有nil / empty对象(如空字符串或空数组/集)进行测试,可以使用以下命令:

static inline BOOL IsEmpty(id object) {
    return object == nil
        || ([object respondsToSelector:@selector(length)]
        && [(NSData *) object length] == 0)
        || ([object respondsToSelector:@selector(count)]
        && [(NSArray *) object count] == 0);
}

答案 6 :(得分:3)

有两种情况:

对象可能是[NSNull null],或者是不可能的  您的应用程序通常不应使用[NSNull null];,只有在想要将“ null ”对象放入数组或将其用作字典值时才使用它。然后你应该知道哪些数组或字典可能包含空值,哪些可能不包含空值  如果您认为数组永远不会包含[NSNull null]值,则不要检查它。如果存在[NSNull null],则可能会出现异常,但这很好:Objective-C异常表示编程错误。并且您有一个编程错误,需要通过更改一些代码来修复。

如果某个对象可以[NSNull null],那么您只需通过测试即可轻松检查  (object == [NSNull null])。调用isEqual或检查对象的类是无稽之谈。只有一个[NSNull null]对象,普通的旧C运算符以最直接,最有效的方式检查它。

如果您检查的NSString对象不是[NSNull null](因为您知道它不能是[NSNull null],或者您刚检查到它与[NSNull null]不同,那么你需要问问自己如何处理空字符串,即长度为0的字符串。如果你认为它是null字符串,如nil,则测试(object.length == 0)。object。如果object == nil,则长度将返回0,因此此测试涵盖长度为0的nil对象和字符串。如果处理长度为0的字符串与nil字符串不同,只需检查是否object == nil

最后,如果要将字符串添加到数组或字典中,并且字符串可能为nil,则可以选择不添加它,将其替换为@"",或将其替换为{{ 1}}。用[NSNull null]替换它意味着你失去了区分“无字符串”和“长度为0的字符串”的能力。用@""替换它意味着在访问检查[NSNull null]对象的数组或字典时必须编写代码。

答案 7 :(得分:2)

这是我用于安全字符串而不是获取"(null)"的宏。 UILabel上的字符串,例如:

#define SafeString(STRING) ([STRING length] == 0 ? @"" : STRING)

假设您有一个成员类和名称属性,名称为nil:

NSLog(@"%@", member.name); // prints (null) on UILabel

with macro:

NSLog(@"%@", SafeString(member.name)); // prints empty string on UILabel

干净整洁。

答案 8 :(得分:2)

你只需检查nil

if(data[@"Bonds"]==nil){
  NSLog(@"it is nil");
}

if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) {
    NSLog(@"it is null");
}

答案 9 :(得分:1)

尝试使用check null

 if (text == nil)

答案 10 :(得分:1)

@interface NSString (StringFunctions)
- (BOOL) hasCharacters;
@end

@implementation NSString (StringFunctions)
- (BOOL) hasCharacters {
    if(self == (id)[NSNull null]) {
        return NO;
    }else {
        if([self length] == 0) {
            return NO;
        }
    }
    return YES;
}
@end

NSString *strOne = nil;
if([strOne hasCharacters]) {
    NSLog(@"%@",strOne);
}else {
    NSLog(@"String is Empty");
}

这适用于以下情况,NSString *strOne = @""NSString *strOne = @"StackOverflow"NSString *strOne = [NSNull null]NSString *strOne

答案 11 :(得分:1)

if(textfield.text.length == 0){
   //do your desired work
}

答案 12 :(得分:0)

完整检查字符串的空条件可以是:< \ br>

    if(mystring)
     {
       if([mystring isEqualToString:@""])
        {
          mystring=@"some string";
        }
     }    
    else
     {
        //statements
     }

答案 13 :(得分:0)

如果还没有这种东西,你可以制作一个NSString类别:

@interface NSString (TrucBiduleChoseAdditions)

- (BOOL)isEmpty;

@end

@implementation NSString (TrucBiduleChoseAdditions)

- (BOOL)isEmpty {
    return self == nil || [@"" isEqualToString:self];
}

@end

答案 14 :(得分:0)

我只用

检查空字符串
  

if([myString isEqual:[NSNull null]])

答案 15 :(得分:0)

对我有用的是if ( !myobject )

答案 16 :(得分:0)

对于字符串:

+ (BOOL) checkStringIsNotEmpty:(NSString*)string {
if (string == nil || string.length == 0) return NO;
return YES;

}

请参考下图:

enter image description here

答案 17 :(得分:0)

对于字符串:

+ (BOOL) checkStringIsNotEmpty:(NSString*)string {
if (string == nil || string.length == 0) return NO;
return YES;}

答案 18 :(得分:-1)

if ([linkedStr isEqual:(id)[NSNull null]])
                {
                    _linkedinLbl.text=@"No";
                }else{
                    _linkedinLbl.text=@"Yes";
                }

答案 19 :(得分:-1)

if ([strpass isEqual:[NSNull null]] || strpass==nil || [strpass isEqualToString:@"<null>"] || [strpass isEqualToString:@"(null)"] || strpass.length==0 || [strpass isEqualToString:@""])
{
    //string is blank  
}