如何检测NSString是否为空?

13 浏览
0 Comments

如何检测NSString是否为空?

我有一段代码,用于检测一个`NSString`是否为`NULL`、`nil`等。然而,它导致程序崩溃。以下是我的代码:\n

NSArray *resultstwo = [database executeQuery:@"SELECT * FROM processes WHERE ready='yes' LIMIT 0,1"];
for (NSDictionary *rowtwo in resultstwo) {
    NSString *getCaption = [rowtwo valueForKey:@"caption"];
    if (getCaption == NULL || getCaption == nil || [getCaption isEqualToString:@""] || [getCaption isEqualToString:@" "]) {
        theCaption = @"Photo uploaded...";
    }
}

\n以下是错误信息:\n

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x3eba63d4'

\n我做错了什么吗?我需要以不同的方式来处理吗?

0
0 Comments

问题原因:需要判断一个NSString对象是否为空,但是不知道如何进行判断。

解决方法:使用下面的方式来检测NSString是否为空。

if(!getCaption || [getCaption isKindOfClass:[NSNull class]])

这种方式是首选的方法来检测NSNull对象。

0
0 Comments

NSString是一个常用的Objective-C类,用于表示字符串。有时候我们需要判断一个NSString对象是否为空(null)。下面的内容提供了两种方法来判断NSString是否为空,并给出了解决方案。

第一种方法是使用`isEqual:`方法来判断:

if ([myNSString isEqual:[NSNull null]]) {
    // NSString对象为空
}

这种方法会检查myNSString对象是否与NSNull对象相等。

第二种方法是直接比较指针是否相等:

if (myNSString == [NSNull null]) {
    // NSString对象为空
}

因为NSNull是一个单例对象,所以可以直接比较指针是否相等。

但是,直接比较指针是否相等并不是一个好方法。虽然[NSNull null]是一个单例对象,但是NSNull仍然是一个类,可能会有其他的实例存在。所以,不建议使用这种方法来判断NSString是否为空。

以上就是如何判断NSString是否为空的方法和解决方案。希望对你有所帮助!

0
0 Comments

如何检测NSString是否为null?

Objective-C对象的NULL值(类型为id)是nil。

而NULL用于C指针(类型为void *)。

(最终两者都会保存相同的值(0x0)。但它们在类型上有所不同。)

在Objective-C中:

- nil(全小写)是指向Objective-C对象的空指针。

- Nil(大写)是指向Objective-C类的空指针。

- NULL(全大写)是指向其他任何东西的空指针(即C指针)。

- [NSNull null]是在无法使用nil的情况下(例如向NSArray添加/接收nil),用于替代nil的单例。

在Objective-C++中:

- 除了上述所有内容外,还有:

- null(小写)或nullptr(C++11或更高版本)是指向C++对象的空指针。

因此,要检查是否为nil,您应该明确地与nil进行比较(或分别与NULL进行比较):

if (getCaption == nil) ...

或者让ObjC / C为您隐式地处理:

if (!getCaption) ...

这是因为C中的每个表达式(Objective-C是其超集)都具有隐式的布尔值:

expression != 0x0 => true

expression == 0x0 => false

现在,当检查NSNull时,这显然行不通,因为[NSNull null]返回指向NSNull的单例实例的指针,而不是nil,因此它与0x0不相等。

因此,要检查是否为NSNull,可以使用以下两种方法之一:

if ((NSNull *)getCaption == [NSNull null]) ...

或(首选,参见注释):

if ([getCaption isKindOfClass:[NSNull class]]) ...

请记住,后一种方法(利用消息调用)如果getCaption恰好为nil,则返回false,虽然形式上是正确的,但可能不是您所期望的。

因此,如果由于某种原因需要同时检查nil / NULL和NSNull,那么必须结合这两个检查:

if (!getCaption || [getCaption isKindOfClass:[NSNull class]]) ...

有关等效正检查的帮助,请参见De Morgan定律和布尔否定。

编辑:NSHipster.com刚刚发表了一篇关于nil、null等之间微妙差别的优秀文章。

真相是,[rowtwo valueForKey:@"caption"]返回的是一个NSNull实例,而不是一个NSString实例。

请参阅答案中的最后一行。

这可能并不能解决您真正的问题,请参阅与问题相关的Bavarious的评论。

他弄错了。我在我的应用程序中到处使用这种方法,它可以正常工作-请参阅我在代码中的编辑,以了解我如何填充数组等。

我建议您不要使用-valueForKey:,因为它有不同的用途。如果您使用NSDictionary,请使用其-[NSDictionary objectForKey:]方法。如果要了解更多关于KVC和-valueForKey:的信息,请参考苹果网站上的几个指南。

getCaption == [NSNull null]是一个不好的使用方法。最好使用[getCaption class] == [NSNull class]。您可以自由地创建NSNull的新实例,而不是使用单例。

我发现使用'(getCaption == [NSNull null])'也可以正常工作,但会出现比较警告,所以我将其更改为'if (getCaption == (id)[NSNull null])'。

我还必须检查NSNull,很奇怪。似乎我的NSString被设置了。

完美的答案,清晰明了。

谢谢!完美的答案!

0