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
.