一:概述
NSArray是不可变数组,一旦数组建立后,数组元素不能增加或删除,也就是不能改变数组的长度,而数组中的元素的值也不能修改,只能是最初创建的值。
NSMutableArray是可变数组,它是NSArray的子类,它可以对数组元素进行增,删,改。
二:创建数组的几个方法
//c语言数组 NSString *num[3]={@"first",@"second",@"third"}; //创建数组 最后一个元素必须是nil NSArray *student = [NSArray arrayWithObjects:@"aaa",@"bbb",@"ccc",@"ddd",nil]; //利用已创建的数组初始化 NSArray *stuCopy=[NSArray arrayWithArray:student]; //利用c数组初始化 NSArray *numCopy=[NSArray arrayWithObjects:num count:3];
这几个方法创建的数组都是利用源数组初始化新的数组,新数组在内存中与源数组不在同一块区域。
三:数组常用的方法
1.数组排序 (对数组执行排序操作,返回的是一个新的数组,对源数组中元素的排序没有影响)
1 //创建元素字符串 2 NSString *data=@"15,13,18,9,23"; 3 4 //字符串转数组 5 NSArray *temp=[data componentsSeparatedByString:@","]; 6 7 //排序数组 8 NSArray *array=[temp sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 9 10 //将元素封装为可以按数字大小比较的NSNumber对象 11 NSNumber *number1=[NSNumber numberWithInt:[obj1 intValue]]; 12 NSNumber *number2=[NSNumber numberWithInt:[obj2 intValue]]; 13 14 //进行比较 15 NSComparisonResult result=[number1 compare:number2]; 16 17 //若obj1和obj2是降序排列,则返回结果为1,即源数组将按升序排列。 18 return result == NSOrderedDescending; //按升序排列 19 // return result == NSOrderedAscending; //按降序排列 20 }];
2.判断数组是否包含给定元素 。
实现原理:利用-containsObject:(id)object这个方法,在方法中遍历整个数组,向每一个数组元素发送-isEqual:(id)object这个方法,若有某个元素的结果为TRUE,则返回YES,否则返回NO。
-isEqual方法在判断NSString和NSNumber详解:
-isEqual的方法在两个判断的对象指针相等的情况下则肯定是返回TRUE的,那么在指针不等而值相等的情况下有以下几种情况。
(1)判断NSString的情况
判断字符串是否相等的唯一条件就是字符串的hash值。所以只要字符串的值相等,不管指向它的指针是否相等,则判断结果就是TRUE。
ps:NSString *[email protected]"abc";
NSString *str2=[NSString stringWithFormate:@"abc"];
str1在 常量区,而str2在堆区,两个字符串的指针不一样,但是字符串的值都是@"abc".那么 [str1 hash] == [str2 hash] .同样 [str1 isEqual:str2]的结果为TRUE。
(2)判断NSNumber的情况
首先是NSNumber在创建时的指针分配,NSnumber在创建时,如果用相同的方法创建,只要值相等,则返回内存中相同的指针。
ps:NSNumber *number1=[NSNumber numberWithIntValue:1];
NSNumber *number2=[NSNumber numberWithIntValue:1];
则number1和number2指向的是内存中的相同区域,也就是number1 == number2.
ps:NSNumber *number1=[NSNumber numberWithIntValue:1];
NSNumber *number2=[NSNumber numberWithDouble:1.0];
此时number1和number2的值不相等,number1 != number2。但是 [number1 hash] == [number2 hash]。同样[number1 isEqual:number2]结果为TRUE。
所以-isEqual在判断NSString和NSnumber时,就直接考虑它的值是否相等,而不管这两个在内存中是否指向同一个对象。
(3)判断NSIndexPath的情况和上两种情况一样,只要两个对象的值相等,不管在内存中是否为同一个对象,用isEqual判等的结果为TRUE
(4)在判断一般自定义类的情况,如果没有重写isEqual方法,则系统只简单的判断是否指针相等,即是否为内存中的同一个对象。若重写isEqual方法,则有一定的规定格式和要求。
系统默认的判等:
- (BOOL)isEqual: (id)other { return self == other; } - (NSUInteger)hash { return (NSUInteger)self; }
3.枚举遍历数组
-objectsEnumerator; //得到枚举对象
-reverseObjectEnumerator; //得到反向枚举对象
// NSEnumerator示例 NSArray *array = [NSArray arrayWithObjects:@"One", @"Two", @"Three", @"Four", nil]; //生成枚举 NSEnumerator *enumerator = [array objectEnumerator]; //获取枚举对象 id thing; while (thing = [enumerator nextObject]) { NSLog(@"I found %@",thing); }
快速枚举 for (type newVariable in expression){ //todo } , 快速枚举用到了修改监视器,
如果在枚举的过程中企图修改集合, 则会产生异常。
4.数组元素组合成字符串
-(NSString *)componentsJoinedByString:(NSString *)separator ;