Xcode基础:Objective-C中的数组详解

有些时候,你需要使用一系列数据。比如一堆字符串,将每一个串都赋一个变量将是一件很麻烦的事情。当然,Objective-C中,这里有更好的解决方案:数组(array)。一个数组是一组有序的对象列表(更具体的说是一组对象指针的列表)。你可以向数组添加对象,移除对象,或者查看数组的给定位置上存放了哪个对象。你也可以查看数组里包含了几个元素。

我们数数习惯由1开始。在数组中,第一个元素的索引是0,第二个索引是1,以此类推。

本文后面的部分还会有一些例子来说明从0开始计数的作用。

有两个类提供了数组:NSArray和NSMutableArray。带有字符串的数组分为固定数组和可变数组两种。在本章中,我们只体积可变数组。

通过执行下面这个步骤可以创建数组:

[NSMutableArray array]

这个语句会产生一个空数组。但是……请等等,这句代码有些古怪,不是么?实际上,这个例子中我们使用类NSMutalbeArray的名字来说明信息接收方。但是我们希望向类的一个实例发送信息,而不是类本身。

好了,我们又学到了一些新的东西:事实上,在Objective-C语言中,我们可以向类发送信息(原因是类本身也是对象,它是被元类(meta-class)的实例,但本书中不再就此问题做深入探讨)。在Cocoa的说明文件中,能够直接作用于类的方法(类方法)名称前用加号“+”标示,与前面表示减号“-”的实例方法不同(见第8章例[4.5])。在说明文件中我们可以见到对方法array这样的描述:

再回到代码中,下面的程序用于创建一个空的数组,并将三个字符串储存在其中,之后显示数组元素个数。

例[1]

#import
 <foundation foundation.h="">
int
main (int
argc, const
char 
* argv[])
{
    NSAutoreleasePool
 *pool = [[NSAutoreleasePool alloc] init];
    NSMutableArray
 *myArray = [NSMutableArray array];
    [myArray addObject:@"first string"];
    [myArray addObject:@"second string"];
    [myArray addObject:@"third string"];
    int count = [myArray count];
    NSLog(@"There are %d elements in my array", count);
    [pool release];
    return 0;
}</foundation>
运行结果如下:

There are 3 elements in my array

接下来的程序和前面的大体一致,只是最后显示存储在索引0中的的字符串。为此,我们在语句行[2.13]中使用了方法“objectAtIndex:”。

例[2]

#import
 <foundation foundation.h="">
int main (int argc, const char * argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSMutableArray *myArray = [NSMutableArray array];
    [myArray addObject:@"first string"];
    [myArray addObject:@"second string"];
    [myArray addObject:@"third string"];
    NSString *element = [myArray objectAtIndex:0]; // [2.13]
    NSLog(@"The element at index 0 in the array is: %@", element);
    [pool release];
    return 0;
}</foundation>
这次的运行结果如下:

The element at index 0 in the array is: first string

你将会经常需要查看数组中的每一个元素以便进行其它操作。为此你可以参照下面例子,使用循环语句按照索引顺序显示数组中的每个元素:

#import
 <foundation foundation.h="">
int main (int argc, const char * argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSMutableArray *myArray = [NSMutableArray array];
    [myArray addObject:@"first string"];
    [myArray addObject:@"second string"];
    [myArray addObject:@"third string"];
    int i;
    int count;
    for(i = 0, count = [myArray count]; i < count; i = i + 1)
    {
       NSString *element = [myArray objectAtIndex:i];
       NSLog(@"The element at index %d in the array is: %@", i, element);
    }
    [pool release];
    return 0;
}</foundation>
运行结果如下:

The element at index 0 in the array is: first string
The element at index 1 in the array is: second string
The element at index 2 in the array is: third string

需要注意的是数组不仅仅可以用于字符串操作。它可以用于任何你希望用数组操作的对象。

类NSArray和类NSMutableArray提供了许多其它方法,希望你能够通过查看说明文件进一步学习与数组操作相关的知识。我们把置换数组内元素这个问题作为本章的结束。置换数组内元素要使用到方法“replaceObjectAtIndex:… withObject:…”。到目前为止,我们见到的方法最多只有一个参数,而这个方法不同,这就是为什么你在这里看到它,它带有两个参数。其实你可以看出来的,因为这个方法带有两个冒号。在Objective-C语言的方法可以使用任意多参数。下面是这个方法的语法:

[myArray replaceObjectAtIndex:1 withObject:@"Hello"];

运行这个方法后,索引1中的对象已经变成了字符串@”Hello”。当然,这个方法只能援引那些有效的索引。换句话说,原来索引中应当有对象,我们才可以用这个方法置换进新的对象。你可能发现了,Objective-C语言的方法的名字好似句子填空。当你要使用一个方法,只要填上你需要的值构成一个有意义的“句子”即可。这种给方法命名的方法来源于Smalltalk(一种由Xerox公司开发的面向对象的系统——译者按),也是Objective-C语言一大特色,它可以大大增强代码的描述性。当创建自己的方法时,你也应当尽量按照这种方法命名,不仅可以提高代码的可读性,而且使你的程序便于维护。





猜你喜欢

转载自blog.csdn.net/lbuskeep/article/details/39204961
今日推荐