我有一种方法,我想确保在遇到“空”字符串时做一些特别的事情。当它实际上有一个字符串,或者当我专门将它设置为“nil”或“NULL”时,它工作得很好,但是当我尝试测试未初始化的NSString时它会崩溃。我该如何处理这种情况?
例如:
-(void) WhyDoICrash
{
NSString *foo;
// Some other stuff...
// foo should be considered "empty"
if (foo == nil || foo == NULL || [foo length] == 0)
{
// whatever
}
}
=============编辑===================
好的,上面只是一个显示问题的非常简单的例子。我实际上正在使用NSString的类别,这意味着我得到的一些(好的,但不适用)建议无法使用。这是我的确切代码:
#pragma mark - NSString Category
@interface NSString (NullOrEmptyTesting)
+(BOOL) isNullOrEmpty: (NSString*)input;
@end
@implementation NSString (NullOrEmptyTesting)
+(BOOL) isNullOrEmpty: (NSString*)input
{
return (input == (id)[NSNull null] || input.length == 0);
}
@end
答案 0 :(得分:5)
(...)但是当我尝试测试未初始化的NSString时崩溃了。我该如何处理这种情况?
通过初始化相应的变量来处理它,例如
NSString *foo = nil;
在C和Objective-C中,automatic variables未初始化为0 - 您无法对该变量中包含的值进行任何假设。请参阅此问题:What happens to a declared, uninitialized variable in C? Does it have a value?
此外,
if (foo == nil || foo == NULL || [foo length] == 0)
相当于:
if (foo == nil || [foo length] == 0)
并且,从Objective-C supports messaging nil
objects开始,通常会测试:
if ([foo length] == 0)
仅
请注意,在分配实例时,Objective-C会将实例变量初始化为0。
答案 1 :(得分:0)
如果你正在进行AND比较,你就不会崩溃。
即
if ((foo != nil) && (foo != NULL) && ([foo length] > 0))
{
// do something
}
你崩溃的原因是你正在进行的OR比较会评估所有内容(包括[foo length],每次)。在这种情况下,您正在向无效对象发送消息,因此崩溃。
进行AND比较时。一个成功的“foo == NULL”测试将停止评估其他所有内容(所以你不会进入 - 并崩溃 - [foo length])