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

我在我的iPhone应用程序中使用这个

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

但是会引发一些exception,控制台显示标题是“(null)”。

所以我现在使用这个:

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

有什么区别,什么是确定一个string是否为空的最好方法?

正如其他人指出的那样,Cocoa / Objective C下有很多种“null”。但是还有一点需要注意的是[Title是KindOfClass:[NSNull class]]是毫无意义的复杂,因为[NSNull null]被logging为单身人士,所以你可以检查指针相等。 查看cocoa的主题:使用空值 。

所以一个好的testing可能是:

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

请注意,即使标题为零,title.length也将返回0 / nil / false,即在这种情况下为0,因此您不必特殊情况。 这是Objective-C的新手遇到麻烦,尤其是来自其他语言的消息/方法调用无法崩溃的情况。

它就像一样简单

 if([object length] >0) { // do something } 

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

这会得到一个空string和长度为0的string。

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

  • 在Objective-C中if(variables)与if(variables!= nil)相同

我认为你的错误与其他事情有关,因为你不需要做额外的检查。

也看到这个相关的问题: 正确检查无sqlite文本列

我发现,为了真正做到这一点,你最终不得不做类似的事情

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

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

所有这些“为我工作的答案”是什么? 我们都用相同的语言编码,规则是

  1. 确保参考不是
  2. 检查并确保string的长度不为0

这是什么将为所有人工作。 如果一个给定的解决scheme只“为你工作”,它的唯一原因是你的应用程序stream程将不允许引用可能为null或string长度为0的情况。正确的方法是处理你想在所有情况下。

如果你想testing所有零/空对象(比如空string或空数组/集合),可以使用下面的代码:

 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); } 

有两种情况:

对象可能是[NSNull null] ,或者是不可能的。
你的应用程序通常不应该使用[NSNull null]; 如果你想把一个“ null ”对象放到一个数组中,或者把它用作字典值,​​你只能使用它。 然后你应该知道哪些数组或字典可能包含空值,哪些可能不包含空值。
如果您认为数组永远不会包含[NSNull null]值,则不要检查它。 如果有一个[NSNull null] ,你可能会得到一个exception,但这很好:Objective-Cexception表示编程错误。 而且你有一个编程错误,需要通过修改一些代码来修复。

如果一个对象可能[NSNull null] ,那么通过testing就可以很简单地检查这个对象
(object == [NSNull null]) 。 调用isEqual或检查对象的类是无稽之谈。 只有一个[NSNull null]对象,普通的旧C运算符以最直接和最有效的方式检查它。

如果你检查一个不能是[NSNull null]NSString对象(因为你知道它不能是[NSNull null]或者你只是检查它与[NSNull null]不同[NSNull null] ,那么你需要问自己想怎么处理一个空string,即一个长度为0的string。如果将它视为一个nullstring,如nil ,则testing(object.length == 0) 。如果object == nil ,则object.length将返回0,所以此testing涵盖零对象和长度为0的string。如果你把一个长度为0的string作为不同于零的string,只要检查object == nil

最后,如果你想添加一个string到一个数组或字典,并且string可以是零,你可以select不添加它,用@""replace它,或者用[NSNull null]replace它。 用@""replace它意味着你不能区分“无string”和“长度为0的string”。 用[NSNull null]replace它意味着当你访问检查[NSNull null]对象的数组或字典时,你必须编写代码。

你只是检查零

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

要么

 if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) { NSLog(@"it is null"); } 
 if(textfield.text.length == 0){ //do your desired work } 

试试这个检查null

  if (text == nil) 
 @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

如果这种事情不存在,你可以创build一个NSString类别:

 @interface NSString (TrucBiduleChoseAdditions) - (BOOL)isEmpty; @end @implementation NSString (TrucBiduleChoseAdditions) - (BOOL)isEmpty { return self == nil || [@"" isEqualToString:self]; } @end 

什么对我来说是if ( !myobject )

完整的空string检查可以如下所示:<\ br>

    如果(MyString的)
      {
        if([mystring isEqualToString:@“”])
         {
           mystring = @“一些string”;
         }
      }    
    其他
      {
         //语句
      } 

我只检查空string

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

 if ([linkedStr isEqual:(id)[NSNull null]]) { _linkedinLbl.text=@"No"; }else{ _linkedinLbl.text=@"Yes"; } 
 if ([strpass isEqual:[NSNull null]] || strpass==nil || [strpass isEqualToString:@"<null>"] || [strpass isEqualToString:@"(null)"] || strpass.length==0 || [strpass isEqualToString:@""]) { //string is blank }