firstObject 和 objectAtIndex:0 之间的 NSArray 区别

NSArray difference between firstObject and objectAtIndex:0

在下面的示例中,数组 objectAtIndex:0 崩溃但 firstObject 产生了一个 nil 值。为什么会这样?

NSArray *array = [NSArray new];
id obj1 = [array firstObject]; // this is giving nil value
id obj2 = [array objectAtIndex:0]; // this line crashes

因为它们的工作方式和记录方式不同。它明确指出这就是它们的工作方式。 firstObject 在 Obj-C 世界中是 'safe' 因为它会 return nil 并且如果无事可做,则无操作。

使用 firstObject 是系统定义的 API,如果有 none,则 returns 为零。但是,如果您尝试访问 objectAtIndex,它将给出 NSRange 异常并且应用程序将崩溃。

在框架中,对于 firstObject 方法,可能会检查数组是否为空,然后 return nil。但是对于 objectAtIndex: 将尝试在给定索引处获取对象,并且由于数组为空,因此它崩溃给出了超出范围的原因。

这是一个 iOS7 功能

5. Implementation of -[NSArray firstObject]

NSArray *arr = @[]; 
// Before iOS7
id item = [arr count] > 0 ? arr[0] : nil; 
// After iOS7
id item = [arr firstObject]; 

[array firstObject]array[0]有很大区别。第一个 firstObject nil 和第二个在数组为空时抛出异常。假设 firstObject 的工作方式类似于 lastObject 作为程序员的角度来看,崩溃不是什么好事,所以还是用firstObject.

比较好