本节我们将介绍OC的数组对象NSArray NSMutableArray,我之所以称它为数组对象,是因为我感觉他既不是基本数据类型中的数组,又和Java、C++
容器又有些不同。首先我们来对比数组,首先他不属于基本数据类型也和基本运算符无关(例如无论是Java还是C++或一些其他的语言的数组都可以
使用[]来进行下标运算,但OC的数组对象不可以),其次在形式上也有不同(其他的数组都是使用本类型声明,而OC统统采用NSArray或NSMutableArray)
声明。然后我们再让他与容器对比:我们知道Java中的容器是通过对象和泛型来实现的,而C++中的容器是通过模板实现的。而且无论是Java还是
C++的容器,一旦声明就只能在同一个容器对象中保存一种对象,而OC不同,在同一个对象中可以存放任何类型的OC对象。
好,做完了与数组和容器的对比,那么我们再来进行NSArray与NSMutableArray的对比:
其实二者的区别其实就是NSArray是不可变的数组对象,一旦建立NSArray,那么无论是NSArray对象的容量还是NSArray里面存放的内容,就都是不
可改变的。而NSMutableArray是可变数组对象,也就是说创建NSMutableArray对象后,无论是对对象容量还是对对象内部存储的内容都是可以任意
修改的。
再次声明无论是NSArray还是NSMutableArray都只能保存OC对象,不能保存基本数据类型。
好,下面我们首先介绍一下NSArray的基本使用方法:
1.NSArray的创建与初始化:
NSArray *arr = [[NSArray alloc] init];
创建了一个空的数组对象,但是由于此对象时不可变对象,所有不能再向对象内保存任何内容
NSArray *arr = [NSArray arrayWithObject:@"cvsdh"];
创建一个包含一个对象不可变数组。
NSArray *arr = [NSArray arrayWithObjects:@"cdsh",@"cbsj",@"bcsj", nil];
创建一个包含n个对象的不可变数组对象,注意最后面的nil不是要保存的对象,而是对象数组的结束标识符
unsigned long count = arr.count;
获取数组对象的长度,注意后边使用的是arr.countcount是一个方法而不是属性,上面所写等价与:unsigned long count =[arr count];
获取第一个对象:[arr firstObject];
获取最后一个对象:[arr lastObject];
根据位置获取对象:[arr objectAtIndex];
根据对象获取其在数组对象中的位置:[arr indexOfObject:@"csdh"];
在对象数组的某个范围内查找对象获取其在数组对象中的位置:[arr indexOfObject:@"bcdj" inRange:NSMakeRange(0,2)];
让数组对象中的每个对象都执行一个方法:[arr makeObjectPreformSelector:@selector(test)];
让数组对象中的每个对象都执行一个方法(只能带一个参数):[arr makeObjectPreformSelector:@selector(test) withObject:@"ttse"];
代码实例:
下面我们来讲解关于数组对象的遍历,在这里我们一共讲解三种数组对象的方法:
经典的for循环遍历
for(int i = 0; i < arr.count; i ++){
id obj = [arr objectAtIndex:i];
..........
}
for遍历
for(id obj in arr){
...........
}
使用OC特有的block进行遍历
[arr emumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
.............
}];
如上面所展示的block,其中obj就是遍历中遍历到的当前对象,idx是一个无符号整形变量代表次对象位于NSArray中的位置,*stop代表遍历
是否继续进行,一旦给*stop赋值YES,遍历就会立即停止。
看实例代码:
下面讲解一些其他处理方法,由于比较简单,就不再细说,可以看看代码以及注释就可以了:
接下来我们就要讲解一个关于NSArray的重点了,关于排序方法:
首先说明,此次对NSArray进行排序,NSArray内部保存的都是同一种类型的自定义变量:Student,而Student有三个成员变量:(NSString)_name
,(int)_age,(Book*)_book,其中_name、_age框架定义类型和基本数据类型而Book为自定义类型Book仅有一个成员变量:(NSString)_name。
下面我们来看看Student和Book的声明文件:
Student:
Book:
为了排序首先我们创建一个NSArray,里面全部填充Student对象
好,下面我们来看具体的排序方法:
其实我们想想所有的排序算法其实都是一样的,不一样的是如何知道两个对象的大小。也就是说只要你能说出两个对象如何比较大小,其他的事情
系统都是可以帮你完成的。我们回顾我们所学,其实我们有两种方法可以告诉系统如何比较我们自定义类型的大小一个是我们在定义对象时实现对
象比较的方法,另一个就是我们可以定义一个block来比较两个对象的大小。
我们首先介绍第一种排序方法:
我们需要定义对象比较的方法,(比较方案首先比较姓名,姓名相同比较年龄,年龄相同我们再对所持有的书籍的书名进行排序),由于比较算法
是在定义对象时定义的(Student的compareStudent:和Book的compareBook:两个比较方法),我们可以直接看对象的定义文件:
完成了比较算法的编写,我们只需要将我们编写的比较算法告诉系统,系统就会自动我们排序啦:
结果正如我们所料,下面让我们来介绍第二种排序方法:使用block来比较对象的大小,也就是说我们定义一个block告诉系统如何进行对象的大小比较:
结果也和我们预料的一模一样,但是不知道大家在写了以上两种比较算法后,有没有感觉到很繁琐,同时不知各位是否也发现了其中的某些规律:其实
无论我们是对什么样的自定义对象进行比较,其实最终都是在对基本数据类型的比较,那么我们是否可以这样,我们告诉系统我们要比较自定义对象的
哪些属性,是按照升序还是降序比较,以及属性比较的先后顺序,然后系统就可以自动生成比较算法了(基本数据类型的比较系统本身就是知道的),那
么进而就可以排序了?没错最后一种排序算法就是按照这个思路来完成的:
1、生成一系列的NSSortDescriptor(排序描述对象),告诉我们要比较的属性,以及是按升序还是降序比较
2、将NSSortDescriptor按照一定的顺序放入NSArray,告诉系统我们首先比较那个属性然后比较那个........最后比较那个
3、NSArray传入系统进行排序
看代码:
结果和我们预料到一样,至此三种排序算法我们就都已经介绍完毕了 。
上面我们讲解了NSArray,他是一种不可变数组对象,下面我们介绍一下NSMutableArray,它也是一种数组对象只不过他是可变的,也就是说,当初始化
之后我们同样也可以修改它的内容。事实上除此之外它和NSArray基本上市相同的。因此我们就简单讲解一下它特殊的用法,其实就是一些为了改变它的
内容而提供的一些方法,都很简单,我们直接看代码:
好了至此所有关于数组对象的类型及其使用方法都已经介绍完毕了。希望各位读者能够好好看看,然后多练练,虽然内容比较多只要大家认真学习我想
各位的收获还是会很大的。
这篇博客详细介绍了Objective-C中的NSArray和NSMutableArray的区别及使用方法。NSArray是不可变数组,一旦创建,容量和内容都无法改变;而NSMutableArray是可变数组,可以随时修改其容量和内容。博客内容包括数组的创建、初始化、遍历、对象操作以及排序方法,特别强调了如何对自定义对象进行排序,包括实现比较方法和使用block进行比较。

2094

被折叠的 条评论
为什么被折叠?



