3

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

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

输出:

    __NSArrayI
    __NSArrayM

但是这种行为没有记录在 Apples 文档中。

依赖arrayWithArray:nil返回空数组的假设是否安全?
或者我应该像这样显式分配空数组:

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

1 回答 1

5

的文档+arrayWithArray:说:

创建并返回一个数组,该数组包含另一个给定数组中的对象。

当然,nil不是数组,而是[nil count]有效并返回0,所以这里可能会被视为空数组。

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

添加:

如果您+arrayWithArray:使用无效类型调用,例如 a NSString,那么程序当然会抛出异常。但是从错误信息

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

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

于 2012-08-26T06:16:44.647 回答