您的位置:首页 > 其它

集合使用NSArray、NSSet、NSDictionary的使用

2014-02-01 19:23 633 查看
一、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)的子类,一般使用子类较多,比较方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NSArray NSSet NSDictionary