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



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

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

输出:

    __NSArrayI
    __NSArrayM

但此行为未记录在 Apple 文档中。

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

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

+arrayWithArray:的文档说:

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

当然,nil不是数组,但[nil count]有效并返回 0 ,因此在这里它可能被视为空数组。

但我不会依赖这一事实并创建带有 [[NSMutableArray alloc] init][NSMutableArray array] 的空数组。

添加:

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

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

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

最新更新