首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》2.5 深入学习NSArray与NSMutableArray

关灯直达底部

开发iOS应用时经常要用到数组,现在开始深入学习数组的相关知识。

Objective-C中的数组可以存储不同类型的对象,虽然items数组目前只存储BNRItem对象,但是也可以存储NSDate对象或其他对象。这一点和很多强类型(strongly-typed)语言不同,这些语言的数组只能保存一种类型的对象。

数组对象只能保存指向Objective-C对象的指针,所以不能将基本类型(primitive)的变量或C结构加入数组对象。如果要将基本类型的变量和C结构加入数组,可以先将它们“包装”成Objective-C对象,例如NSNumber、NSValue和NSData。

注意,不能将nil加入数组对象。如果要将“空洞”加入数组对象,就必须使用NSNull对象。NSNull对象的作用就是代表nil,所以可以用来解决这类问题,代码如下:

[items addObject:[NSNull null]];

访问数组中的对象时,可以向数组对象发送objectAtIndex:消息,它会返回指定索引的对象,但是这种语法非常繁琐,还有一种更简洁的下标语法:

NSString *foo = items[0];

这行代码与发送objectAtIndex:消息的效果是相同的:

NSString *foo = [items objectAtIndex:0];

下面在BNRItem.m中使用下标语法重新实现randomItem方法。

+ (instancetype)randomItem

{

...

NSString *randomName = [NSString stringWithFormat:@"%@ %@",

 [randomAdjectiveList objectAtIndex:adjectiveIndex],

 [randomNounList objectAtIndex:nounIndex]];

NSString *randomName = [NSString stringWithFormat:@"%@ %@",

 randomAdjectiveList[adjectiveIndex],

 randomNounList[nounIndex]];

int randomValue = arc4random % 100;

...

return newItem;

}

构建并运行应用,检查控制台中的输出结果是否和之前的结果相同。

方括号的嵌套层数越多,代码的可读性就越差。因为方括号的作用可能不同,容易产生混淆:有的是发送消息,有的是存取方法,有的是访问数组中的对象。坚持使用点语法和下标语法可以清晰地突出消息发送代码,也可以避免代码过于冗长。

与点语法和存取方法的关系相同,下标语法和objectAtIndex:消息编译后的结果也是一样的,编译器会自动将下标语法转换为objectAtIndex:消息。

在NSMutableArray中,可以使用下标语法向数组中添加和修改对象。

NSMutableArray *items = [[NSMutableArray alloc] init];

items[0] = @"A"; // Add @"A"

items[1] = @"B"; // Add @"B"

items[0] = @"C"; // Replace @"A" with @"C"

这几行代码等价于向items发送insertObject:atIndex:和replaceObject- AtIndex:withObject:消息。