一、NSArray
NSArray继承自NSobject对象,为了解决存储不同类型的多个元素,其实更像是Java中的List,只能放OC对象,不能直接存放基本数据类型,也不能存放空值,不可变,arrayWithObjects这个方法初始化数组的时候里面的nil值不能删除,代表数组终止标记,不是数组元素。
基本使用和循环
void array(){ //只能放OC对象,不能直接存放基本数据类型,也不能存放空值,不可变 //空数组 NSArray *assary=[NSArray array]; //只能存放一个 NSArray *a=[NSArrayarrayWithObject:@""]; //nil不能删除,代表数组终止标记,不是数组元素 NSArray *a2=[NSArrayarrayWithObjects:@"baidu",@"tencent",@"bnm",nil]; //取出第二个元素 NSLog(@"arrar length=%@", [a2objectAtIndex:2]);
for (int i=0; i<a2.count; i++) { id obj=[a2 objectAtIndex:i]; NSLog(@"第%i个元素的值是%@",i,obj); } //快速遍历 for (id obj in a2) { NSLog(@"----->%@",obj); } //当数组每遍历一个元素时,就会调用一个block,而且每次传入的参数值都不一样 //BOOL *stop; //每次调用都会判断*stop //如果不用指针那么函数内部赋值,外界就拿不到 [a2 enumerateObjectsUsingBlock: ^(id obj,NSUInteger idx,BOOL *stop) { //停止 if(idx==1){ *stop=YES; } NSLog(@"第%zi个元素-----是%@",idx,obj); }];
//获取最后一个元素 [a2 lastObject]; //是否包含某个元素 [a2 containsObject:@"baidu"]; NSLog(@"arrar length=%zd",[a2count]); } |
数组内存管理,每添加一个对象会对对象进行一次retain操作,当数组销毁的时候会对内部所有对象进行一次release操作
void arrayMemo(){ Dog *d1=[[Dogalloc]init]; Dog *d2=[[Dogalloc]init]; Dog *d3=[[Dogalloc]init]; [d1release]; //每当一个对象被添加到NSarray中,会对这个对象retain NSArray *array=[[NSArrayalloc] arrayWithObjects:d1,d2,d3,nil];
//当(NSArray)数组被销毁时,会对内部存储的所有对象做一次retain [arrayrelease];//d1被销毁 [d2release];//d2被销毁 } |
按照指定字符把一个字符串切割成一个数组
按照指定字符拆分数组为一个字符串
//按照指定字符拆分字符串为数组 void arrySplit(){ NSString *str=@"abc,hk,am,tw"; NSArray *arry=[strcomponentsSeparatedByString:@","];
//把数组元素按照指定字符拼接成字符串 NSString *str2=[arrycomponentsJoinedByString:@"#"];
} /*把数组写入到文件,会在文件中生成xml**/ void tofile(){ NSArray *array=[NSArrayarrayWithObjects:@"123",@"456",@"abc",nil]; NSString *path=[NSStringstringWithFormat:@"/Users/user/desktop/testvxxxt.txt"]; [array writeToFile:pathatomically:YES]; } /*读取数组*/ void getFile(){ NSArray *as=[NSArrayarrayWithContentsOfFile:@"/Users/user/desktop/testvxxxt.txt"]; } |
在读取数组文件的时候,这个文件必须按照数组导出的格式,也就是XML内容规范。
在我们开发中其实这种不可变数组很少使用,更多的使用的是它的子类NSMutableArray,而
NSMutableArray大部分方法都和NSArray一样,只是在添加元素时有些区别
void mutableArraytest(){ //每添加一个元素都回retain,每删除一个元素,都回对元素release操作数组销毁所有元素都会release NSMutableArray *array=[NSMutableArrayarray]; [arrayaddObject:@"123456"]; [array addObjectsFromArray:@"7889"]; [array removeAllObjects]; [array removeLastObject]; [array removeObjectAtIndex:1]; //指定位置替换 [array replaceObjectAtIndex:2withObject:@"jj"]; } |
二、NSSet
NSSet对比Java,那么就是Java中的set了,set中的元素并没有顺序,并且元素不能重复
void nsset(){ NSSet *s=[NSSetsetWithObjects:@"aa",@"22",@"kk",nil]; //随机取元素 id obj=[sanyObject]; [s enumerateObjectsUsingBlock:^(id obj,BOOL *stop) { NSLog(@"%@",obj); }]; NSMutableSet *s2=[NSMutableSetset]; [s2addObject:@"f4"]; NSLog(@"--%@",obj); } |
三、NSDictionary和Java中的map一样
//无序 //每当我们添加key或者value的时候元素都被retain,销毁的时候都会被release //不可变 void dictionary(){ NSDictionary *n =[NSDictionarydictionaryWithObject:@"baidu.com"forKey:@"url"]; NSDictionary *ns2=[NSDictionarydictionaryWithObjectsAndKeys: @"g.cn",@"url", @"安康",@"address", @"110",@"tel", nil]; NSArray *keys=[NSArrayarrayWithObjects:@"name",@"tel",nil]; NSArray *values=[NSArrayarrayWithObjects:@"张三",@"110",nil]; NSDictionary *n3=[NSDictionarydictionaryWithObjects:valuesforKeys:keys];
[n3 enumerateKeysAndObjectsUsingBlock:^(id key,id obj, BOOL *stop) { NSLog(@"key:%@----value:%@",key,obj); }];
for (id keyin n3) { id obj=[n3objectForKey:key]; NSLog(@"key=%@,value=%@",key,obj); } //获取所有值 [n3allValues]; //获取所有key [n3allKeys]; // NSLog(@"%@",n3); // NSLog(@"%@",[ns2 objectForKey:@"url"]); //NSLog(@"length%zi",[ns2 count]); }
//可变 void mutbaledic(){ NSMutableDictionary *dict=[NSMutableDictionarydictionary];
[dict setObject:@"baidu.com"forKey:@"url"];
[dict removeObjectForKey:@"url"]; } |
在OC中也提供了更方便的方法让我们对数组和字典进行操作,如果我们想再集合中放入数字(int float double),那么我们先要用NSNumber进行一层包装,因为集合里面必须放入的是OC对象,而如果我们需要一个位置用空值占位的时候,不能直接用nil而要用[NSNull null],[NSNull null]是一个单例,不管调用多少次都返回的是同一个对象。
NSNumber *t=@20; //编译器编译时会自动展开上面的包装方法 NSNumber *s=@20.25f; int a=20; NSNumber *n2=@(a); NSArray *ars=@[@"aaa",@"bb",[NSNull null],@10]; NSLog(@"----%@",ars[0]);
NSDictionary *dict=@{@"name":@"zhangsan",@"tel":@"110"};
//根据key获取值 NSString *name =dict[@"name"]; |
注意:上面快速创建集合的方式生成的集合都是不可变的集合,所以不能赋值给Mutable的子类集合。
总结:
1.array有序 set无序
2.array可以重复 set元素不重复
3.NSDictionary无序键值对存储
4.集合添加元素的时候,添加的对象都会retain,集合销毁的时候里面的对象都回release
5.集合像NSString一样都有不可变(父类)和可变(Mutable)的子类,一般使用子类较多,比较方便。