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

7 浏览
0 Comments

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

我在我的iPhone应用程序中使用了这段代码:

if (title == nil) {
    // 做些什么
}

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

所以现在我使用了这段代码:

if (title == nil || [title isKindOfClass:[NSNull class]]) {
    // 做些什么
}

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

0
0 Comments

Objective-C中检查空字符串的正确方法是使用如下代码:

if (string == nil || [string isEqualToString:@""]) {
    // string为空
} else {
    // string不为空
}

问题的出现是因为有些开发者可能会错误地使用以下代码进行空字符串的检查:

if (!string) {
    // string为空
} else {
    // string不为空
}

这种方式在Objective-C中是不准确的,因为一个空字符串在Objective-C中被视为非空。因此,使用这种方式来检查空字符串会导致错误的判断结果。

为了解决这个问题,我们应该使用第一种方式来检查空字符串。首先,我们需要判断字符串是否为nil,然后再判断字符串是否为空字符串。只有当字符串既不为nil也不为空字符串时,我们才可以确定字符串不为空。

另外,还可以参考相关的文章和问题来了解更多关于检查空字符串的方法。在这些文章和问题中,开发者们分享了他们遇到的类似问题以及解决方案。通过阅读这些文章和问题,我们可以更好地理解如何正确地检查空字符串。

希望这篇文章对你理解Objective-C中检查空字符串的正确方法有所帮助。如果你还有其他关于Objective-C的问题,可以在本站上查找更多相关的文章和问题,以获得更多的帮助和解决方案。

0
0 Comments

在Cocoa/Objective C中,有许多种类型的“null”。但需要注意的是,[title isKindOfClass:[NSNull class]]这种写法过于复杂,因为[NSNull null]被文档化为单例,所以可以直接检查指针的相等性。具体可以参考Cocoa的文档: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会导致崩溃。

谢谢!但是我之所以问这个问题,是因为我在"标题"(title)为null的情况下出现了异常。

那么title应该是什么类型?比如,如果是一个NSString,我会收到以下警告:comparison of distinct Objective-C types 'struct NSNull *' and 'struct NSString *' lacks a cast。有没有办法解决这个问题(不知道从问这个问题以来有没有改变)?

这是我没有编译代码就发布的结果;-)。title可能是一个NSString,但无论title的类型如何,只需要将null强制转换为通用的id类型:(id)[NSNull null]。

嗨,我测试了一个将字符串设置为nil的情况,并查看是否通过了这个语句:if(string == (id)[NSNull null])。但它从来没有通过。你能举一个string等于[NSNull null]的示例吗?

nil和[NSNull null]永远不会相同。[NSNull null]是一个单例对象,可以作为nil的替代品使用(例如在NSArray或NSDictionary值中)。因此,一个使用场景可能是,如果你有一个包含可选字符串的NSArray,其中一些可能为null,并且你在数组中使用[NSNull null]来表示null的情况。实际上,这种测试很少需要,只有在你(或你使用的库!)主动使用[NSNull null]作为占位符时才需要。

主要的区别在于,nil是一个指向空的指针(实际上是一个“空指针”),它的内存地址表示为0x0,并且它来自C语言的NULL。另一方面,[NSNull null]是一个被约定为null值表示的对象(它与0x0的内存地址不同,但作为单例,它在运行时只占用一个固定的内存地址)。由于类似NSArray *NSDictionary *的集合不能接受null指针,所以它们可以接受[NSNull null]而没有问题,因为它是一个实例化的对象。

从Flutter来到这里,寻找一个解释为什么Dart中的Map项的值(在Dart中为null)与Objective C中的nilNULL不对应的原因。原因是实际上[NSNull null]才是null,而不是NULL。谢谢!

0
0 Comments

在Objective-C中,检查空字符串的正确方法是使用以下代码:

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

需要记住,在Objective-C中,如果字符串对象为空,它会返回0作为值。这将同时获取到空字符串和长度为0的字符串。

如果对象是NSNull,则此方法将不起作用,仍然需要显式检查是否为NSNull。

你还可以为NSNull创建一个分类,使其返回0作为长度。

如果对象是NSNull,这个方法将会导致程序崩溃。

如果对象等于NSNull,这个方法也会导致程序崩溃。

除了NSNull无法识别选择器的问题外,这种方法不能区分一个指针为空的NSString和一个实际存在但是为空字符串的NSString(例如字面量`object = @"";`或`object = nil;`)。

那如果字符串只是空的,但不是nil呢?

0