2.OC中的数组 什么是OC数组? 答:a.OC的数组元素是任意类型的对象指针(即:地址);它的结构和C语言的链表结构相似;同时,它也是一种有序的集合。 ------------------------------------------------------------------------------------ 1)分类: 不可变数组NSArray 和 可变数组NSMutableArray ------------------------------------------------------------------------------------ 2)创建一个OC的不可变数组对象 方法一: NSArray * array = [[NSArrayalloc]initWithObjects:@"one",@"two",@"three",nil]; //nil是OC数组初始化时的一个结束标志,不是数组元素 方法二: //将一个数组对象(array)的内容,初始化给另一个数组对象(array1) NSArray * array1 = [NSArrayarrayWithArray:array]; ------------------------------------------------------------------------------------ 3)对不可变数组的一些操作 操作一: //通过下标访问对应的数组元素,不要越界访问 例如: NSString * str = [arrayobjectAtIndex:0]; 操作二: //获取数组元素个数 例如: NSUInteger count = array.count; ------------------------------------------------------------------------------------ 4)数组枚举器(用于遍历数组) 注意://在用枚举器遍历数组时,数组的值只能读,不能改 操作一: //创建一个正序的数组枚举器 NSEnumerator * enumer1 = [arrayobjectEnumerator]; //执行过程://数组创建了一个枚举器,把数组的元素地址依次传给枚举器;这个时候数组将会和枚举器建立一种关联 操作二: //使用枚举器遍历数组 例如: id obj; while (obj = [enumer1nextObject]) { NSLog(@"obj = %@",obj); } 执行过程: 第一次循环,枚举器会把数组的第一个元素赋给obj;第二次循环,枚举器把数组的第二个元素赋给obj,依次类推直到最后,把nil赋给obj. 操作三: //使用快速枚举(正序)遍历数组 例如: for (id obj2in array) { NSLog(@"obj2 = %@",obj2); } 执行过程: 第一次循环,枚举器会把数组的第一个元素赋给obj2;第二次循环,枚举器把数组的第二个元素赋给obj2,依次类推直到最后,把nil赋给obj2. 操作四: //逆序枚举器 例如: //数组逆序把元素地址传给枚举器 NSEnumerator * enumer2 = [arrayreverseObjectEnumerator]; //第一次循环把数组的最后一个元素赋给obj 第二次把倒数第二个赋给obj 依次类推直到最后; while (obj = [enumer2nextObject]) { NSLog(@"obj = %@",obj); } ------------------------------------------------------------------------------------ 5)数组查找元素 方法一: //数组查找元素,找到之后返回对应的(第一个找到的下标)下标找不到返回NSNotFound NSUInteger index = [arrayindexOfObject:@"one"]; 方法二: //在指定范围内查找; NSUIntegerindex = [arrayindexOfObject:@"one"inRange:NSMakeRange(1, array.count -1)]; *********************************************************************** 3.获取类/对象的类型 1)获取某对象的类型 Class cls = [dog1class]; //获取dog1指向的对象的类的类型 ------------------------------------------------------------------------------------ 2)获取某个类的类型 [Dogclass];//获取Dog类的类型 ------------------------------------------------------------------------------------ 3)//判断id类型指向的对象,是否是某类的一个实例对象 id obj; BOOL ret = [objisKindOfClass:[Dogclass]]; //判断obj指向的对象是否是Dog类的一个实例对象 *********************************************************************** 4.打印对象指针 与 description函数 执行过程:如果要打印对象指针,系统会给指针指向的对象发送一个description ,然后会找当前对象的类有没有description方法,有那么就调用,没有就去父类找(NSObject实现的description只是打印对象的地址),那么如果想打印出对象指针指向的对象内容,我们必须要重写description消息。 例如: NSString * str =@"welcome to beijing"; NSLog(@"%@",str);//[str description] Dog *dog = [[Dogalloc]initWithAge:10name:@"Tom"]; NSLog(@"dog = %@",dog);//打印对象指针等价于打印这个函数调用[dog description]; NSLog(@"dog = %@",[dogdescription]);//打印对象指针;实际上会调用description方法; //那么如果想打印出dog对象指针指向的对象内容(age和name的值)我们必须要重写description消息 重写的description 例如: //描述一个对象的具体信息(描述一个对象的内容是什么) - (NSString *)description { NSString * str = [NSStringstringWithFormat:@"age = %d name = %@",age,name]; return str; } *********************************************************************** 5.字符串的分割 方法一: NSString * str =@"You are a good man!"; NSArray * array = [strcomponentsSeparatedByString:@" "];//以字符串整体作为分割条件 NSLog(@"str = %@",str); NSLog(@"array = %@",array); ***注意//分割函数的返回值是一个NSArray*; 方法二: array = [strcomponentsSeparatedByCharactersInSet:[NSCharacterSetcharacterSetWithCharactersInString:@" !"]];//按照字符进行分割 执行过程: //NSCharacterSet 字符集合类 //[NSCharacterSet characterSetWithCharactersInString:@" !"];创建一个字符集合 //把Oc字符串@“ !”转化为字符集合; //字符集合的成员是字符' '和字符‘!’; 注意: //OC字符串在分割的时候,如果分割条件两边只要一边没有内容或者没有不是分割条件的内容,那么会分割说一个空字符串@""; //@"good !man!";man后面的!因为右边没有内容所以会分割出一个@""; //因为good !;空格和! 都有一边是分割条件(也就是说不是非分割条件)这个时候也会分割说一个空的字符串 *********************************************************************** 6.字符串拼接 例如: NSString * ptr = [arraycomponentsJoinedByString:@"###"]; //把数组元素按照@”###“这个字符串拼接成一个字符串; ***注意//字符串拼接函数返回值类型:NSString* *********************************************************************** 7.可变数组对象 1)创建一个可变数组 方法一: NSArray * array1 = [[NSArrayalloc]initWithObjects:@"1",@"2",nil]; 方法二: //把不可变数组转化为可变数组 NSMutableArray * array2 = [NSMutableArrayarrayWithArray:array1]; 方法三: //创建一个空的可变数组 NSMutableArray * array3 = [[NSMutableArrayalloc]init ]; 2)对可变数组的操作:增、删、改、排序 ---------增---------- //增加一个元素 [array4addObject:@"iOS"]; ---------删---------- 方法一: //删除"ios"这个元素,如果包含多个,则都删除 [array4removeObject:@"iOS"]; 方法二: //删除所有 [array4removeAllObjects]; 方法三: //删除最后一个元素 [array4removeLastObject]; 方法四: //再一定范围内删除某元素 [array4removeObject:@"iOS"inRange:NSMakeRange(1,3)]; ---------改---------- [array4replaceObjectAtIndex:0withObject:@"Android"];//替换(修改元素) ---------交换---------- [array4exchangeObjectAtIndex:0withObjectAtIndex:4];//交换 NSSet: 是一个集合与数组差不多,但是集合中的元素不能有重复的而且他是无序的
数组排序
有很多各种各样的方法来对一个数组排序。如果数组存储的是字符串对象,sortedArrayUsingSelector:是第一选择:
- NSArray *array = @[@"John Appleseed", @"Tim Cook", @"Hair Force One", @"Michael Jurewitz"];
- NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
下面的代码对存储数字的内容同样很好,因为NSNumber实现了compare::
- NSArray *numbers = @[@9, @5, @11, @3, @1];
- NSArray *sortedNumbers = [numbers sortedArrayUsingSelector:@selector(compare:)];