arrayWithArray:nil返回空数组但未记录

时间:2012-08-26 06:11:13

标签: iphone objective-c

当参数为nil时,NSArray和NSMutableArray的+arrayWithArray:返回空数组而不是nil。

    NSLog(@"%@", [[NSArray arrayWithArray:nil] class]);
    NSLog(@"%@", [[NSMutableArray arrayWithArray:nil] class]);

输出:

    __NSArrayI
    __NSArrayM

但苹果文档中未记录此行为。

依赖arrayWithArray:nil返回空数组的假设是否安全? 或者我应该像这样明确地指定空数组:

    NSDictionary *dic = [[NSDictionary alloc] init];
    NSMutableArray *arr = [dic objectForKey:@"a"];
    if (!arr) {
        arr = [[NSMutableArray alloc] init];
    }

1 个答案:

答案 0 :(得分:5)

+arrayWithArray:的文档说:

  

创建并返回包含另一个给定对象的数组   阵列。

当然,nil不是数组,但[nil count]有效且返回0,因此可能会将其视为空数组。

但我不会依赖这个事实并使用[[NSMutableArray alloc] init][NSMutableArray array]创建空数组。

<强>增加:

如果您使用无效类型致电+arrayWithArray:,例如一个NSString,当然程序会抛出异常。但是从错误消息

-[__NSCFConstantString count]: unrecognized selector sent to instance 0x69e4

你可以看到count确实是用于复制数组元素的第一种方法。这也解释了为什么它适用于nil