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

一、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; icount; 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)的子类,一般使用子类较多,比较方便。



你可能感兴趣的:(Object-c基础)