Objective-C中除了可以使用C中的基本数组外,如int[5],char word[] ={‘a’,'b’,'c’};Foundation还提供了NSArray类.Foundation是有序的对象集合.NSArray保存的对象可以是 不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。例如下面的代码在运行时会报错:

NSArray *arrs = [[NSArray alloc]initWithObjects:@”abc”,@”123″,456,nil];

就 像NSString和NSMutableString一样,同样也存在可变数组和不可变数组.不可变数组是由NSArray类处理的,而可变数组则是由 NSMutableArrray处理的.后者是前者的子类,也就是说NSMutableArrray继承了NSArray的方法.

NSArray 不可变数组

使用NSArray关键字创建一个不可变的数组,一旦初始化完毕后这个数组的元素是不可以在动态的添加与删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
intmain(intargc,constchar*argv[])
{
 
    @autoreleasepool{
 
        //创建一个包含星期的数组
        NSArray*days=[NSArray arrayWithObjects:@"SUN",@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT",nil];
 
        //获取数组所包含对象个数
        NSLog(@"size of days:%ld",(unsignedlong)[days count]);  //size of days:7
 
        //循环打印数组中的元素
        for(inti=0;i<[days count];i++){
            NSLog(@"%@",[days objectAtIndex:i]);
        }
 
        //另一种方法打印数组中的元素
        for(idday indays){
            NSLog(@"%@",day);
        }
 
    }
 
    return0;
}

NSArray的类方法arrayWithObjects:使用一列对象作为元素创建数组,这种情况下需要按顺序列出对象并使用逗号隔开.将这个数组的最后一个值指定为nil,标记参数数组的结束.它实际上并不会存储在数组中.

[array count] : 得到这个数组对象的长度。
[array objectAtIndex index]: 传入数组的索引(index) 得到数据对象。
[arrayWithObjects: ...] :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil,以标志结束.

上面我们使用了两种方法遍历数组中的元素,第一种方式比较普遍,但是效率不好 ,推荐使用第二种方式.

+(id)arrayWithObjects:obj1,obj2,…nil 创建一个新的数组,obj1,obj2……是他的元素对象,以nil对象结尾
-(BOOL)containsObject:obj 确定数组中是否包含对象obj
-(NSUInteger)count 返回数组元素个数
-(NSUInteger)indexOfObject:obj 第一个包含obj元素的索引号
-(id)objectAtIndex;i 返回存储在位置 i 的对象
-(void)makeObjectsPerformSelector:(SEL)selector 将 selector 只是的消息发送给数组中的每个元素
-(NSArray*)sortedArrayUsingSelector:(SEL)selector 根据selector 指示的比较方法对数组进行排序
-(BOOL)writeToFile:path atomically:(BOOL)flag 将数组写入指定的文件中,如果 flag 为 YES,则需要先创建一个临时文件
MSMutableArray可变数组

大多时候我们需要动态的增加和删除数组中的元素,这就需要使用MSMutableArray.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
intmain(intargc,constchar*argv[])
{
 
    @autoreleasepool{
 
       //创建一个空数组
       NSMutableArray*arrs=[NSMutableArrayarray];
 
        //C中的一些基本元素我们可以用NSNumber类来包装,类似java中的装箱,另外还有一些struct类型的数据我们也可以用NSNumber类的父类NSValue来进行包装,包装成NSValue的对象再将其放入数组中。
        intage=23;
        charc='a';
        floatf=3.1415926;
        NSRectrect=NSMakeRect(1,2,3,4);
 
        NSNumber*objAge=[NSNumber numberWithInt:age];
        NSNumber*objC=[NSNumber numberWithChar:c];
        NSNumber*objF=[NSNumber numberWithFloat:f];
        NSValue*objRect=[NSValue valueWithRect:rect];
 
        [arrs addObject:objAge];
        [arrs addObject:objC];
        [arrs addObject:objF];
        [arrs addObject:objRect];
 
        //如果要添加空的话可以用以下方法
        [arrs addObject:[NSNullnull]];
 
        NSLog(@"Size of arrs: %li",(unsignedlong)[arrs count]);//Size of arrs: 5
        NSLog(@"%@",arrs);
 
        //创建一个指定初始容量的数组
        NSMutableArray*arrs2=[NSMutableArray arrayWithCapacity:3];
 
        //指定初始容量为3,但我们添加了5个对象
        [arrs2 addObject:@"obj1"];
        [arrs2 addObject:@"obj2"];
        [arrs2 addObject:@"obj3"];
        [arrs2 addObject:@"obj4"];
        [arrs2 addObject:@"obj5"];
 
        //将对象 obj 插入到索引为 i 的位置
        [arrs2 insertObject:@"obj" atIndex:0];
 
        //删除指定索引处的对象
        [arrs2 removeObjectAtIndex:3];
 
        //遍历数组
        for(idobj inarrs2){
            NSLog(@"%@",obj);    //obj,obj1,obj2,obj4,obj5
        }
 
        //合并字符串数组
        NSString*str=[arrs2 componentsJoinedByString:@"|"];
        NSLog(@"%@",str);  //obj|obj1|obj2|obj4|obj5
 
        //字符串切割成数组
        NSArray*arr3=[str componentsSeparatedByString:@"|"];
        NSLog(@"%@",arr3);
 
    }
 
    return0;
}

NSMutableArray类常用方法

array 创建一个空数组
+(id)arrayWithCapacity:size 创建一个数组,指定容量为size
-(id)initWithCapacity:size 初始化一个新分配的数组,指定容量为size
-(void)addObject:obj 将对象obj添加到数组末尾
-(void)insertObject:obj atIndex:i 将对象 obj 插入到索引为 i 的位置
-(void)replaceObject:obj atIndex:i 将数组中索引为 i 处的元素用obj 置换
-(void)removeObject:obj 从数组中删除所有是 obj 的对象
-(void)removeObjectAtIndex:i 从数组中删除索引为 i 的对像
-(void)sortUsingSelector:(SEL)selector 用 selector 只是的比较方法将数组排序
Objective-C的新特性之Object Literals


苹果WWDC2012大会上介绍了大量Objective-C的新特性,其中有一点就是Object
Literals,它允许你方便地定义数字、数组和字典对象。这个功能类似于java5提供的auto
boxing功能。这虽然是一个语法糖,但对提高写代码效率帮助很大。

更多关于Objective-C的新特性请查看:Objective-C新特性.

为了方便你的旧代码迁移到新的写法,xcode专门还提供了转换工具,在Xcode中,选择 Edit -> Refactor -> Convert to Modern Objective-C Syntax即可。如下所示:

然后就会自动帮我们转换成新的语法:

数组对象(NSArray和NSMutableArrray)的更多相关文章

  1. iOS开发基础:OC数组对象NSArray的常用方法

    本文介绍了OC的数组对象的基本方法的使用: 因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为: [objc] v ...

  2. Objective-C( Foundation框架 一 数组(NSArray))

    OC数组 NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域,一旦初始化,不能通过它对该内存区域的数据进行修改操作,但是它可以读数据. NSMutableArray是动态的 ...

  3. Objective-c 数组对象

    首先我们必须知道数组的概念:数组是有序的对象集合,一般情况下,一个数组的对象都是相同类型的.数组当中也存在可变数组和不可变数组. 1. 不可变数组 (NSArray) 可变数组 NSMutable 是 ...

  4. ios 把数组对象转成json字符串存起来

    1第一步是我们获取数据源 一般我们都是从接口请求数据 NSArray *subColumnsArray = nil; NSDictionary *dict = [NSJSONSerialization ...

  5. 了解JavaScript 数组对象及其方法

    数组在我目前学习过的编程语言中都可以见到, 形形色色的方法也数不胜数, 不过功能都一样, 最多也就是方法名稍稍有所不同, 老外也没个准啊, 如果英语比较好的同学对于学习方法(method)来说是很快的 ...

  6. 简述JavaScript对象、数组对象与类数组对象

    问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...

  7. java数组对象的浅层复制与深层复制

    实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.

  8. MongoDB学习笔记~官方驱动嵌套数组对象的更新

    回到目录 对于数组对象mongodb本身是支持的,不过对于数组的更新,mongodb的Csharp驱动目前只支持一级,即你的对象里包含数组,而数组又包括数组,这表示两层,这在更新子数组时,Csharp ...

  9. jquery解析php通过ajax传过来的json二维数组对象

    ajax获得php传过来的json二维数组对象,jquery解析 php代码: <?php $news = array( '武汉'=>array(1,2,3), '广州'=>arra ...

随机推荐

  1. linux用户和用户组管理详解

    Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 用户的账号一方面可以帮助 ...

  2. ssh登陆之忽略known_hosts文件

    在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  3. Spring学习总结(20)——Spring加载多个项目properties配置文件问题解决

    多数的鲜为人知方法都是因为有着罕见的应用,就比如说Spring中PropertyPlaceholderConfigurer这个类,它是用来解析Java Properties属性文件值,并提供在spri ...

  4. python练手系列-分布式监控

    如果我们要写一个监控系统,要注意哪些问题和需求? [1] agent收集数据的时候需要通过系统调用少的方法收集到我们需要数据,一般来说我们优先使用python自带的系统方法,然后是读取/proc 文件 ...

  5. [python学习篇][书籍学习][python standrad library][内置类型]对象测试真值,布尔值操作, 比较操作

    几乎所有对象都可以比较.测试真值.转换为字符串(其实就是用repr()函数,或略有差异的str()函数来转换) 1 对象是否为真 任何对象都可以测试真值,用于if或while的条件或下面布尔运算的操作 ...

  6. [uiautomator篇][8] 增加应用读取内置存储卡的权限

    1 要在androidmainfest.xml增加权限(这样之后,在设备上的权限才可以点击,不然是灰色) <uses-permission android:name="android. ...

  7. Jupyter Notebook与Jupyterhub的安装与配置

    Jupyter Notebook是一个很好用的交互环境,Jupyterhub则在此基础上实现了多用户的管理.最近配置这个环境的时候也遇到了一些坑,想想自己疯狂百度的过程,在此把自己的完整安装配置流程记 ...

  8. 编译安装solr

    1, 获取安装包 wget http://download.oracle.com/otn-pub/java/jdk/8u112-b15/jdk-8u112-linux-x64.rpm wget htt ...

  9. javascript学习笔记 - 面向对象 理解对象

    ECMAScript 中有两种属性:数据属性和访问器属性 一 属性类型 1.数据属性.数据属性有4个描述其行为的特性 [[Configurable]]表示能否通过delete删除属性从而重新定义属性: ...

  10. 九度oj 题目1392:排序生成最小的数

    题目描述: 还记得陈博是个数字完美主义者么?^_^....这次,他又闹脾气了!我们知道计算机中常常要使用数组保存一组数字,但是今天他就要求把数组里的所有数字组成一个,并且这个数字是这些数字所能组成的所 ...