集合:用来存储对象的容器
集合中不可变的类都是可变的类的父类。子类功能更强大,有父类的功能和自身的功能。集合都是以nil结束。
集合中只有数组有序。字典与set都是散列存储(hash),查找快。
arrayWithContentsOfFIle:arrayWithContentsOfURL:
如果文件存的是字符串,读取出来的也是字符串。
如果文件存的是数组,读取出来的也是数组。
如果文件存的是字典,读取出来的也是字典。
如果文件存的是集合,读取出来的也是集合。
不可变都是不支持对对象增删改操作。
一.数组(可存重复对象)
1.不可变
- NSArray(不可对对象增删改)可存放多个对象,每个对象使用下标来表示。
- CFArrayRef(C语言用的数组,用于操作硬件)
- for-in:(in 相当于赋值NSString *s = array)快速遍历同一类型对象
2.可变
集合的内存管理中,如果一个对象(或数组)被加到集合中,集合会使引用计数加1,控制权归集合(系统)。
二.字典
- 以键值对、无序的存储。
- key决定集合个数,key重复会覆盖,一般字符串类型,实际是id。
- 字典有区分范围的作用。当value为数组时(广州),当value为字典时(广州-天河)
- %@可以输出对象描述,起到很好的调试作用。
- 字典的操作都是通过key来实现,把key弄成有序就可以让整个字典有序(但通常很少这个需求)。
三.set
无序集合,存储的对象最好不要重复,重复会覆盖。
四.转换
1数组
//oc可变参数 NSArray *arr1 = [[NSArray alloc]initWithObjects:@"jobs",@"bill",@"keati",nil]; //访问对象 NSString *str0 = [arr1 objectAtIndex:0]; NSLog(@"str0 = %@",str0); NSLog(@"%@",[arr1 lastObject]); NSLog(@"%d",arr1.count); //返回元素位置 NSLog(@"jobs an index:%d",[arr1 indexOfObject:@"jobs"]); for (int i = 0; i < arr1.count;i++) { //NSLog(@"%@",[arr1 objectAtIndex:i]); NSString *str = [arr1 objectAtIndex:i]; NSString *newStr = [str stringByAppendingString:@"1"]; NSLog(@"%@",newStr); } //for-in 快速遍历(指针指向arr1) for (NSString *str in arr1) { NSString *newStr = [str stringByAppendingString:@"2"]; NSLog(@"str = %@",newStr); } NSLog(@" "); //排序 NSArray *orderArray = [arr1 sortedArrayUsingSelector:@selector(compare:)]; for (NSString *s in orderArray) { NSLog(@"%@",s); } //新语法 NSString *str1 = arr1[0]; NSLog(@"str1 = %@",str1); //可变数组 NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:3]; Student *stu1 = [[Student alloc]init]; stu1.name = @"batman"; NSLog(@"stu1 retainCount:%d",[stu1 retainCount]); //添加元素 [mArr addObject:stu1];//系统retian的 NSLog(@"stu1 retainCount:%d",[stu1 retainCount]); Student *stu2 = [[Student alloc]init]; stu2.name = @"oxman"; [mArr addObject:stu2]; NSLog(@"stu1 retainCount:%d",[stu2 retainCount]); Student *stu3 = [[Student alloc]init]; stu3.name = @"superman"; [mArr addObject:stu3]; NSLog(@"stu1 retainCount:%d",[stu3 retainCount]); NSLog(@"mArrCount1 = %@",mArr); [mArr insertObject:stu3 atIndex:0]; //s3,s1,s2,s3 NSLog(@"mArrCount2 = %@",mArr); [mArr removeObjectIdenticalTo:stu3];//remove同一对象,同时引用计数减一 NSLog(@"%@",mArr); [mArr replaceObjectAtIndex:0 withObject:stu1]; NSLog(@"%@",mArr); // NSArray *arr = @[@"3",@"2",@"1"];//新语法 NSMutableArray *mArray = [NSMutableArray arrayWithArray:arr];//父类转子类需通过这层转 [self bubbles:mArray]; NSLog(@"%@",mArray);
-(void)bubbles:(NSMutableArray *)aMutableArray { int count = aMutableArray.count; for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count -1 - i; j++) { int a = [[aMutableArray objectAtIndex:j]integerValue]; int b = [[aMutableArray objectAtIndex:j+1]integerValue]; if (a > b) { [aMutableArray exchangeObjectAtIndex:j withObjectAtIndex:j+1]; } } } }
2.字典
NSDictionary *dic1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"value1",@"key1", @"value3",@"key3", @"value2",@"key2",nil]; //快速输出 NSLog(@"%@",dic1); //访问 NSString *str = [dic1 valueForKey:@"key1"]; NSLog(@"str = %@",str); //不能添加,修改,删除 //元素个数 NSLog(@"dic1 count:%d",dic1.count); //获取所有keys NSArray *keys = [dic1 allKeys]; //获取所有values NSArray *values = [dic1 allValues]; NSLog(@"keys = %@",keys); NSLog(@"values = %@",values); //遍历 for(NSString *key in dic1.allKeys) { NSString *v = [dic1 valueForKey:key]; NSLog(@"dic = %@",v); } //可变字典 NSMutableDictionary *dic2 = [NSMutableDictionary dictionaryWithCapacity:5]; //添加元素 [dic2 setObject:@"value1" forKey:@"key1"]; Student *s = [[Student alloc]init]; s.name = @"jobs"; //添加value为student类型对象的元素 [dic2 setObject:s forKey:@"jobs"]; NSLog(@"dic2 = %@",dic2); //通过覆盖key值来修改 [dic2 setObject:@"jobs" forKey:@"jobs"]; NSLog(@"dic2 = %@",dic2); //通过删除key值删元素 [dic2 removeObjectForKey:@"jobs"]; NSLog(@"dic2 = %@",dic2);
3.Set
NSSet *set1 = [[NSSet alloc]initWithObjects:@"1",@"2",@"3",@"1",nil]; NSSet *set2 =[NSSet setWithObjects:@"2", nil]; BOOL isSubSet = [set2 isSubsetOfSet:set1];//set2是否set1的子集 //快速输出 NSLog(@"set = %@",set1); //求交集 BOOL isInter = [set2 intersectsSet:set1];
4.对象类型转换
//对基本数据类型转为对象类型 NSLog(@"%@",[NSNumber numberWithInt:5]); NSNumber *number = [[NSNumber alloc]initWithInt:9]; NSLog(@"%@",number); //对象类型转整形 NSLog(@"%d",[number integerValue]); //把结构体转为对象类型 CGPoint p = {100,100}; NSValue *val = [NSValue valueWithBytes:&p objCType:@encode(CGPoint)]; NSLog(@"%@",val); //对象类型转为结构体 CGPoint q; [val getValue:&q]; NSLog(@"%@",val); //得到一个空对象,可以存到集合 NSLog(@"%@",[NSNull null]);