IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    jiangwei0910410003发表于 2014-12-08 22:10:45
    love 0

    在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类:

    http://blog.csdn.net/jiangwei0910410003/article/details/41788223

    今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArray类是不可变的,NSMutableArray类是可变的。下面就先来看一下NSArray类


    一、NSArray类

    //
    //  main.m
    //  16_NSArray
    //
    //  Created by jiangwei on 14-10-12.
    //  Copyright (c) 2014年 jiangwei. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    //NSArray中不可以存放基本数据类型,只能存放类的实例,如果需要将基本类型、结构体放入到数组中得话,
    //需要通过NSNumber/NSValue进行数据的封装,同时不能在NSArray中存储nil
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            //1.---------------------数组的创建
            NSString *s1 = @"zhangsan";
            NSString *s2 = @"lisi";
            NSString *s3 = @"wangwu";
            //最后的nil相当于结束的标记
            NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil];
            //打印的时候会调用description方法
            //相当于:array1.description
            NSLog(@"%@",array1);
            
            //使用类方法创建
            array1 = [NSArray arrayWithObjects:s1,s2,s3, nil];
            
            //创建一个数组,将源数组中的数据拿出来放进去
            NSArray *array2 = [NSArray arrayWithArray:array1];
            
            
            //2.----------------------objectAtIndex
            //访问数组中的数据,数组中存放的是对象的指针
            NSString *str1 = [array1 objectAtIndex:0];
            
            
            //3.----------------------count
            //获取数组元素中的个数
            NSUInteger count = [array1 count];//返回的是一个无符号数值
            
            
            //4.----------------------containsObject
            //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值
            BOOL isContains = [array1 containsObject:@"zhangsan"];
            
            
            //5.----------------------indexOfObject
            //返回一个对象在数组中的下标值
            NSUInteger index = [array1 indexOfObject:@"zhangsan"];
            if(index == NSNotFound){
                //没有找到
            }else{
                //找到了
            }
            
            
            //6.----------------------componentsJoinedByString
            //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接
            //注意数组中的元素必须都是字符串
            NSString *content = [array1 componentsJoinedByString:@","];
            
            
            //7.----------------------lastObject
            //访问数组最后一个元素
            NSString *lastObj = [array1 lastObject];
            
            
            //8.----------------------arrayByAddingObject
            //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的
            NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];
            
            
            //数组的遍历
            for(int i=0;i<array1.count;i++){
                NSString *str = [array1 objectAtIndex:i];
                NSLog(@"%@",str);
            }
            
            //快速遍历
            for(NSString *s in array1){
                NSLog(@"%@",s);
            }
            
            //xcode4.4以后,编译器对数组的创建和访问语法做了优化
            NSArray *array7 = @[s1,s2,s3];
            NSString *s = array7[0];
            
        }
        return 0;
    }
    
    下面来看一下他的操作方法:

    1、NSArray的创建

    //1.---------------------数组的创建
    NSString *s1 = @"zhangsan";
    NSString *s2 = @"lisi";
    NSString *s3 = @"wangwu";
    //最后的nil相当于结束的标记
    NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil];
    //打印的时候会调用description方法
    //相当于:array1.description
    NSLog(@"%@",array1);
    我们看到他的initWithObjects方法的最后一个值为nil,这个我们在之前说到过这个值,他是空指针的意思,和Java中的null一样的,这里为什么在创建NSArray的时候最后一个值为空呢?这个和C语言中的场景是类似的,C语言中字符串的结束符为'/0',那么这里的NSArray的最后一个元素为nil,原因是标记NSArray结束了。

    然后我们调用NSLog方法打印NSArray对象,结果:


    我们看到了,会打印出非常格式化的数据出来,这个原因是因为NSLog打印对象的时候会调用其description方法,和Java中的toString方法一样,当然我们可以重写这个方法的,后面会说到。

    我们还可以使用类方法创建NSArray:

    //使用类方法创建
    array1 = [NSArray arrayWithObjects:s1,s2,s3, nil];
    
    //创建一个数组,将源数组中的数据拿出来放进去
    NSArray *array2 = [NSArray arrayWithArray:array1];

    2、使用下标访问元素

    //2.----------------------objectAtIndex
    //访问数组中的数据,数组中存放的是对象的指针
    NSString *str1 = [array1 objectAtIndex:0];


    3、获取数组的大小

    //3.----------------------count
    //获取数组元素中的个数
    NSUInteger count = [array1 count];//返回的是一个无符号数值
    NSUInteger是无符号的int类型


    4、是否包含某一个元素

    //4.----------------------containsObject
    //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值
    BOOL isContains = [array1 containsObject:@"zhangsan"];


    5、找到一个元素在数组中的下标

    //5.----------------------indexOfObject
    //返回一个对象在数组中的下标值
    NSUInteger index = [array1 indexOfObject:@"zhangsan"];
    if(index == NSNotFound){
        //没有找到
    }else{
        //找到了
    }
    这里我们看到用到了一个系统常量:NSNotFound,我们可以看到他的定义:

    #define NSIntegerMax    LONG_MAX
    看到了,是一个Long类型的最大值。


    6、使用指定的连接符连接数组中所有的元素

    //6.----------------------componentsJoinedByString
    //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接
    //注意数组中的元素必须都是字符串
    NSString *content = [array1 componentsJoinedByString:@","];


    7、在数组的尾部增加一个元素

    //8.----------------------arrayByAddingObject
    //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的
    NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];
    因为NSArray是不可变的,所以会产生一个新的NSArray对象,返回回来


    8、数组的遍历

    //数组的遍历
    for(int i=0;i<array1.count;i++){
        NSString *str = [array1 objectAtIndex:i];
        NSLog(@"%@",str);
    }
    
    //快速遍历
    for(NSString *s in array1){
        NSLog(@"%@",s);
    }
    第二种方式和Java中的快速遍历是一样的。


    9、Xcode4.4之后新增了NSArray快速创建的一种方式

    //xcode4.4以后,编译器对数组的创建和访问语法做了优化
    NSArray *array7 = @[s1,s2,s3];
    NSString *s = array7[0];
    这种方式比之前的创建方式又快又方便,而且符合正常的创建方式,访问的时候也是可以直接用下标进行获取元素


    二、NSMutableArray类

    NSArray类是不可变的,NSMutableArray类是可变的,可变类一样的特性,就是可以进行增删改查操作

    //
    //  main.m
    //  17_NSMutableArray
    //
    //  Created by jiangwei on 14-10-12.
    //  Copyright (c) 2014年 jiangwei. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    //NSMutableArray继承NSArray类,有NSArray中的所有方法
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            //1.---------------------创建可变数组
            NSString *str1 = @"zhangsan";
            NSString *str2 = @"lisi";
            NSString *str3 = @"wangwu";
            NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil];
            //下面的这种方式创建的数组是错误的
            //下面的这种方式是创建不可变数组的方式,不能哟关于可变数组的创建
            //NSMutableArray *array1 = @[str1,str2,str3];
            
            //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间
            NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];
            //使用类方法创建
            NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];
            
            
            //2.---------------------addObject
            //添加元素的方法
            [mArray1 addObject:str1];
            [mArray1 addObject:str2];
            //添加数组,把mArray1中的所有元素全部添加到mArray2中
            [mArray2 addObjectsFromArray:mArray1];
            NSLog(@"mArray3 = %@",mArray2);
            
            //二维数组
            //这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了
            [mArray2 addObject:mArray1];
            
            
            //3.---------------------insertObject
            //在指定的位置上插入特定元素
            [mArray2 insertObject:@"def" atIndex:0];
            
            
            //4.---------------------replaceObjectAdIdex
            //替换元素
            [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];
            
            
            //5.---------------------exchangeObjectAtIndex
            //互换两个元素的位置
            [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];
            
            
            //6.---------------------removeObjectAdIndex
            //删除指定位置的元素
            [mArray2 removeObjectAtIndex:0];
            //删除最后一个元素
            [mArray2 removeLastObject];
            //删除指定的对象
            [mArray2 removeObject:@"lisi"];
            //删除所有的对象/清空列表
            [mArray2 removeAllObjects];
        }
        return 0;
    }
    

    1、创建方法

    //1.---------------------创建可变数组
    NSString *str1 = @"zhangsan";
    NSString *str2 = @"lisi";
    NSString *str3 = @"wangwu";
    NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil];
    //下面的这种方式创建的数组是错误的
    //下面的这种方式是创建不可变数组的方式,不能用于可变数组的创建
    //NSMutableArray *array1 = @[str1,str2,str3];
    
    //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间
    NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];
    //使用类方法创建
    NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];
    创建方式和NSArray类似,但是有一种方式不能用,就是直接创建的方式,那个只能用于创建不变数组。

    但是可变数组还有一个方法就是能够事先的设置数组的大小,而且超过这个大小之后,数组会自动扩充,类似于C语言中的动态数组的实现。


    2、添加元素

    //2.---------------------addObject
    //添加元素的方法
    [mArray1 addObject:str1];
    [mArray1 addObject:str2];
    //添加数组,把mArray1中的所有元素全部添加到mArray2中
    [mArray2 addObjectsFromArray:mArray1];
    NSLog(@"mArray3 = %@",mArray2);
            
    //二维数组
    //这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了
    [mArray2 addObject:mArray1];
    NSLog(@"mArray3 = %@",mArray2);
    使用addObjectsFromArray方法是将一个数组中的每个元素添加到指定的数组中

    使用addObject方法是讲一个数组整个都添加到指定的数组中了,那么这个数组就变成二维数组了

    这个两个方法要区分一下~~

    下面是运行结果:



    3、在数组的指定位置上插入元素

    //3.---------------------insertObject
    //在指定的位置上插入特定元素
    [mArray2 insertObject:@"def" atIndex:0];


    4、替换元素

    //4.---------------------replaceObjectAdIdex
    //替换元素
    [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];

    5、互换两个元素的位置

    //5.---------------------exchangeObjectAtIndex
    //互换两个元素的位置
    [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];

    6、删除方法

    //6.---------------------removeObjectAdIndex
    //删除指定位置的元素
    [mArray2 removeObjectAtIndex:0];
    //删除最后一个元素
    [mArray2 removeLastObject];
    //删除指定的对象
    [mArray2 removeObject:@"lisi"];
    //删除所有的对象/清空列表
    [mArray2 removeAllObjects];


    总结

    这篇文章就介绍了Foundation框架中的NSArray类和NSMutableArray类,他们是用来存放一些指定类型的元素的

    注:OC中没有泛型的概念,所以对于数组中存放了不同类型的值,在运行的时候会报错的,这个和Java相比,操作集合类的时候安全性就差了点。所以我们在操作集合类的时候需要注意的地方。















沪ICP备19023445号-2号
友情链接