我在我的 iPhone 应用程序中使用了这个。
if (title == nil) {
// do something
}
但是它抛出了一些异常,控制台显示标题为“(null)”。
所以我现在使用这个:
if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}
什么是差异,以及确定字符串是否为null的最佳方法是什么?
我在我的 iPhone 应用程序中使用了这个。
if (title == nil) {
// do something
}
但是它抛出了一些异常,控制台显示标题为“(null)”。
所以我现在使用这个:
if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}
什么是差异,以及确定字符串是否为null的最佳方法是什么?
正如其他人指出的那样,在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";
注意,即使标题为nil,title.length将返回0/nil/false,即在此情况下为0,因此您无需特别处理它。这是Objective C新手很难习惯的事情,尤其是来自其他语言的消息/方法调用到nil会导致崩溃。nil
是一个指向空值的指针(实际上是“空指针”),它由C语言中的NULL
表示,其内存地址为0x0
。而另一方面,[NSNull null]
是一个被约定为null值表示的对象(它与0x0
内存地址不同,但作为单例,在运行时只会占用一个固定的内存地址)。由于像NSArray *
和NSDictionary *
等集合不能接受空指针,因此它们可以毫无问题地接受[NSNull null]
,因为它是一个已实例化的对象。 - Alejandro IvánMap
项目的值(即在Dart中为null
)与Objective C中的nil
或NULL
不相对应。原因是它实际上是NUNull null
,而不是NULL
null。谢谢@PeterNLewis! - Aleksandar这很简单
if([object length] >0)
{
// do something
}
请记住,在 Objective-C 中,如果对象为 null,它将返回值为 0。
这将使您获得空字符串和长度为 0 的字符串。
if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) {
}
isEqual
和长度检查的情况。我认为你的错误与其他问题有关,因此不需要进行额外的检查。
还请参阅以下相关问题:正确检查nil sqlite文本列
为什么会有那么多"只适合我自己的答案"?我们都在使用同一种语言编程,而规则是:
这样做对于所有人都是有效的。如果某个解决方案只是"只适合你自己",那只是因为你的应用程序流程不允许出现引用为空或字符串长度为0的情况。正确的方法是处理所有情况下所需的方法。
nil
*(注意不是 "null"),则发送消息(例如 length
)将产生 0(或方法返回类型的适当 0 值)。这就是语言的规定。在这种情况下,无需单独检查 nil
。 - jscs如果你想测试所有的nil/空对象(例如空字符串或空数组/集合),你可以使用以下方法:
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]
,你可能会收到异常,但这没关系:Objective-C 异常表示编程错误。你需要更改一些代码来修复编程错误。[NSNull null]
,那么你可以通过测试(object == [NSNull null])
来检查。调用isEqual
或检查对象的类都是无意义的。只有一个[NSNull null]
对象,在最直接和最有效的方式下,普通的 C 操作符可以很好地检查它。NSString
对象,它不能是[NSNull null]
(因为你知道它不能是[NSNull null]
或者刚刚检查过它与[NSNull null]
不同),那么你需要问自己如何处理一个空字符串,即长度为 0 的字符串。如果你将其视为nil
字符串处理,则测试(object.length == 0)
。如果object == nil
,则 object.length 将返回 0,因此该测试涵盖了没有对象和长度为 0 的字符串。如果你将长度为 0 的字符串与 nil 字符串视为不同的字符串,只需检查object == nil
。@""
替换它,或用[NSNull null]
替换它。用@""
替换它意味着你失去了区分“没有字符串”和“长度为 0 的字符串”的能力。用[NSNull null]
替换它意味着你必须编写访问数组或字典时检查[NSNull null]
对象的代码。你只需要检查是否为nil
if(data[@"Bonds"]==nil){
NSLog(@"it is nil");
}
或者
if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) {
NSLog(@"it is null");
}
以下是我用于安全字符串的宏,而不是在UILabel上获取"(null)"字符串的示例:
#define SafeString(STRING) ([STRING length] == 0 ? @"" : STRING)
假设你有一个成员类(member class)和名字属性(name property),并且名字是nil(空):
NSLog(@"%@", member.name); // prints (null) on UILabel
使用宏:
NSLog(@"%@", SafeString(member.name)); // prints empty string on UILabel
干净整洁
如果您在项目中更喜欢检查 nil、Null 和空字符串,可以使用以下扩展代码:
NSString+Extension.h
///
/// Checks if giving String is an empty string or a nil object or a Null.
/// @param string string value to check.
///
+ (BOOL)isNullOrEmpty:(NSString*)string;
NSString+Extension.m
+ (BOOL)isNullOrEmpty:(NSString*)string {
if (string) { // is not Nil
NSRange range = [string rangeOfString:string];
BOOL isEmpty = (range.length <= 0 || [string isEqualToString:@" "]);
BOOL isNull = string == (id)[NSNull null];
return (isNull || isEmpty);
}
return YES;
}
if (![NSString isNullOrEmpty:someTitle]) {
// You can safely use on a Label or even add in an Array for example. Remember: Arrays don't like the nil values!
}
@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
。