如何在iOS中检查NSArray是否为空或空数组?

58

在使用alloc和init初始化一个NSArray后,如果没有向其中添加任何元素,如何检查该NSArray是否为空?

谢谢。

10个回答

113
if (array == nil || [array count] == 0) {
    ...
}

在处理对象时,应该使用 nil(参见 https://dev59.com/YnRB5IYBdhLWcg3wpoxm)。 - user94896
1
你应该同时这样做吗?或者如果数组为nil,[array count] == 0会返回TRUE吗? - shim
9
不需要两者同时使用。在Objective-C中,通过nil对象发送消息会被忽略并返回0。因此,使用if ([array count] == 0) { ... }就足够了。 - trojanfoe
@trojanfoe 发送消息给 nil 不会被忽略,而是有严格预定义的行为。在这种情况下,“count”消息应该返回一个 NSInteger - 因此它确实如此。返回零(0)。 - Motti Shneor
抱歉,但返回一个具体值并不真正意味着“忽略”... 至少在'C'语言的意义上不是这样。你可以将该值[nil count]分配给一个变量,比如int 'c = [nil count];',这将生成真正的汇编代码,将c设置为0 --- 这绝不意味着你对'count'的调用被忽略了,只是通过了'nil'伪对象。当编写复杂的Obj-C代码时,这种差异非常重要。“忽略”意味着“未运行”。 - Motti Shneor
显示剩余3条评论

24

NSArray有count方法,通常的做法是...

if (![self.myArray count])
{
}

这将检查数组是否为空,或者是否设置为nil。


3
如果myArray为nil,会因为空指针异常而崩溃吗? - OMGPOP
4
@OMGPOP:不,它不是这样的。 - Nam Vu

14

虽然我们都在提供同样的答案,我也想提供一下我的看法。

if ([array count] < 1) {
    ...
}

1
对于一个回答,如果它(除了一些人的个人偏好)和其他回答一样好且正确,那么给予匿名踩的加1。这种方法有效的原因是,如果数组为nil,则objc消息在这种情况下将返回0 -- 这是很好定义的。 - justin
感谢您的点赞。除了那个应该无视的幽默评论之外,我真的不明白为什么我应该被踩。因为唯一重要的是代码。 - shabbirv
为什么要使用 < 1 而不是 == 0?< 1 表示我们也可以得到负数,但这似乎并不是我们想要的情况。 - User

9

还有另外一个

if(!array || array.count==0)

2
这意味着数组不是nil。但它仍然可能为空,因此需要逻辑或来检查计数是否为0。如果数组为nil(!array),第二部分甚至不会被评估。 - Jason Cragun
如果数组为nil,array.count将为0。这是Objective-C的明确定义行为。在Objective-C中过度检查nil主要是由Java/C#开发人员带来的。 - Erik Engheim

6

if([myarray count])它检查数组既不为空也不为nil。


4
if([arrayName count]==0)
{
    //array is empty.
}
else
{
   //array contains some elements.
}

4

试试这个

if(array == [NSNull null] || [array count] == 0) {
}

"(array == [NSNull null])" 和 "(array == nil)" 之间有什么区别? - user403015
[NSNull null]NSNull类型的一个对象。因此,如果array == [NSNull null],那么array就是指向该NSNull单例对象的指针。在想要存储对象(例如在字典或数组中)但不接受nil时,经常使用[NSNull null]。如果array == nil,那么这意味着array被清零(指向0x0)。 - Rob
2
@OhhMee 我不知道是谁给它点了踩,但很可能是因为 array == [NSNull null] 不是一个非常有用的检查方式,因为例如如果分配和初始化失败,它将是 nil 而不是 [NSNull null]。鉴于 user403015 概述的情况,[NSNull null] 不是可能出现的情况。 - Rob

3

使用

(array.count ? array : nil)

如果array = nil或者[array count] == 0,它将返回nil。

3
你可以使用这个:
if (!anArray || [anArray count] == 0) {
    /* Your code goes here */
}

@Joel请解释下投反对票的原因。 - RandomGuy
虽然询问为什么被踩是合理的(我也会这样做),但你不应该草率下结论。我很确定我没有投票给你的回答(无论是赞成还是反对)。我所做的唯一一件事就是建议一个编辑(我看到已经被批准了)。 - Joel

1
if (array == nil && [array count] == 0) {
...
}

我使用这段代码是因为当我的pickerview数组为空时,我遇到了麻烦

我的代码如下:

- (IBAction)btnSelect:(UIBarButtonItem *)sender { // 52
if (self.array != nil && [self.array count] != 0) {
    NSString *select = [self.array objectAtIndex:[self.pickerView selectedRowInComponent:0]];

    if ([self.pickListNumber isEqualToString:@"1"]) {
        self.textFieldCategory.text = select;
        self.textFieldSubCategory.text = @"";
    } else if ([self.pickListNumber isEqualToString:@"2"]) {
        self.textFieldSubCategory.text = select;
    }

    [self matchSubCategory:select];
} else {
    UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                          message:@"You should pick Category first"
                                                         delegate:nil
                                                cancelButtonTitle:@"OK"
                                                otherButtonTitles: nil];
    [myAlertView show];
}

[self hidePickerViewContainer:self.viewCategory];
}

第一行代码和示例代码内部的代码是不同的。 - trojanfoe
第一个代码块存在固有的错误。如果(array == nil),它怎么可能有“count”?这个if语句是没有意义的,而且总是会返回false。 - Motti Shneor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接