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

例如下面的代码在运行时会报错:

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

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

NSArray 不可变数组

常用方法如下:

+(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,则需要先创建一个临时文件

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

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

[array count]:得到这个数组对象的长度。

[array objectAtIndex index]:传入数组的索引(index) 得到数据对象。

[arrayWithObjects: ...]:向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil,以标志结束。

例:创建星期的数组并遍历

 int main (int argc,const char * argv[])
{ @autoreleasepool{ //创建一个包含星期的数组
NSArray * days = [NSArray arrayWithObjects: @"SUN", @"MON", @"TUE", @"WED", @"THU", @"FRI", @"SAT", nil]; //获取数组所包含对象个数
NSLog(@"size of days:%ld", (unsigned long)[days count]); //size of days:7 //循环打印数组中的元素
for(int i = ; i < [days count]; i++){
NSLog(@"%@",[days objectAtIndex: i]);
} //另一种方法打印数组中的元素
for(id day in days){
NSLog(@"%@", day);
} } return ;
}

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

MSMutableArray 可变数组

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

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 只是的比较方法将数组排序
 int main(int argc,const char * argv[])
{ @autoreleasepool{ //创建一个空数组
NSMutableArray * arrs = [NSMutableArray array]; //C中的一些基本元素我们可以用NSNumber类来包装,另外还有一些struct类型的数据我们也可以用NSNumber类的父类NSValue来进行包装,包装成NSValue的对象再将其放入数组中。
int age = ;
char c = 'a';
float f = 3.1415926;
NSRect rect = NSMakeRect(,,,); 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: [NSNull null]]; NSLog(@"Size of arrs: %li", (unsigned long)[arrs count]);//Size of arrs: 5
NSLog(@"%@",arrs); //创建一个指定初始容量的数组
NSMutableArray * arrs2 = [NSMutableArray arrayWithCapacity: ]; //指定初始容量为3,但我们添加了5个对象
[arrs2 addObject: @"obj1"];
[arrs2 addObject: @"obj2"];
[arrs2 addObject: @"obj3"];
[arrs2 addObject: @"obj4"];
[arrs2 addObject: @"obj5"]; //将对象 obj 插入到索引为 i 的位置
[arrs2 insertObject: @"obj" atIndex: ]; //删除指定索引处的对象
[arrs2 removeObjectAtIndex: ]; //遍历数组
for (id obj in arrs2){
NSLog(@"%@", obj); //obj,obj1,obj2,obj4,obj5
} //合并字符串数组
NSString * str = [arrs2 componentsJoinedByString: @"|"];
NSLog(@"%@", str); //obj|obj1|obj2|obj4|obj5 //字符串切割成数组
NSArray * arr3 = [str componentsSeparatedByString: @"|"];
NSLog(@"%@", arr3); } return ;
}

oc_转_NSArrray 和 NSMutableArrray的更多相关文章

  1. 数组对象(NSArray和NSMutableArrray)

    Objective-C中除了可以使用C中的基本数组外,如int[5],char word[] ={‘a’,'b’,'c’};Foundation还提供了NSArray类.Foundation是有序的对 ...

  2. 第七篇、OC_图片的裁剪基于SDWebImage

    前期有段时间困扰了我很久一个问题由于工程中的图片数据抓取自不同平台,所以图片的大小尺寸不一定,而放置图片的imageView尺寸是一定的,不作任何处理的话会导致图片拉伸变形,因此找了好久解决办法,现把 ...

  3. 第六十九篇、OC_录制语音和播放语音功能的实现

    录制: 1.设置全局属性 NSURL *recordedFile;//存放路径 AVAudioPlayer *player;//播放 AVAudioRecorder *recorder;//录制 NS ...

  4. 第六十八篇、OC_按照某一字段对数值进行排序

    代码中是根据"create_time_" 进行排序   ascending:决定的是升序还是降序排序 NSSortDescriptor *sortDescriptor = [[NS ...

  5. oc_转_NSInteger 和 NSNumber

    Objective-C 支持的类型有两种:基本类型和类. 基本类型,如同 C 语言中的 int 类型一样,拿来就可以直接用.而类在使用时,必须先创建一个对象,再为对象分配空间,接着做初始化和赋值.类的 ...

  6. oc_转_构造对象的方法,以及类的继承

    一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情: 1) 使用alloc方法来分配存储空间 ...

  7. oc_转_类的数组的实现和操作

    OC的数组对象的基本方法的使用:因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为:   01.#import&l ...

  8. 第六十四篇、OC_计步器

    计步器的实现方式主要有那么两种 1.通过直接调用系统的健康数据,基于HealthKit框架的,但是貌似是一小时更新一次数据.如果要实时获取步数,这种方式并不是最佳. 2.基于CoreMotion框架, ...

  9. 第十八篇、OC_使用OAStackView FDStackView (第三方框架)可以使用在ios 7及以上的版本

    UILabel *view1 = [[UILabel alloc]init]; view1.text = @"Label1"; view1.backgroundColor = [U ...

随机推荐

  1. Linux磁盘管理命令

    1.磁盘分割: fdisk [root@linux ~]# fdisk [-l] 装置名称 参数: -l :输出后面接的装置所有的partition内容.若仅有fdisk -l时, 则系统将会把整个系 ...

  2. java:访问权限-protected实例

    在不同包,子类继承后可以使用父类的protect权限的属性或方法 父类: package com.tinyphp; public class Father { protected String nam ...

  3. C++:析构函数

    析构函数的特点: 1.析构函数与类名相同,但它前面必须加上波浪号~ 2.析构函数不返回任何值,在定义析构函数时,是不能说明它的类型的,甚至说明void类型也不能 3.析构函数没有参数,因此不能被重载. ...

  4. 【c】time.h

    表示时间的三种类型 日历时间:从一个时间点到现在的秒数,用time_t表示 始终滴答时间:从进程启动到现在时钟的滴答数(每秒一般包含1000个).用clock_t表示 分解时间:分解的数据结构如下.用 ...

  5. [转]更新Debian软件源

    转自:香神无涯 sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak #备份一下软件源sudo vi /etc/apt/sources.lis ...

  6. PHP 语言需要避免的 10 大误区

    PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.但是,你大概很奇怪的注意到有少部分的人发誓要离php 远远的.但是令人更奇怪的是或者很震惊的说他们不用php ...

  7. php程序员应具有的7种能力

    php程序员应具有什么样的能力,才能更好的完成工作,才会有更好的发展方向呢?在中国我想您不会写一辈子代码的,那样不可能,过了黄金期,您又怎么办呢?看了本文后,希望对您有所帮助. 一,php能力 1,了 ...

  8. [置顶] Android系统五大布局详解Layout

    我们知道Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前,视图都是由一个一个的组件构成的.组件就是我们常见的Button.TextEdit等 ...

  9. java--面向抽象编程

    所谓面向抽象编程是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,及所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象.就是利用abstract来设计实现用户需求. 比如:我 ...

  10. UVa 11426 (欧拉函数 GCD之和) GCD - Extreme (II)

    题意: 求sum{gcd(i, j) | 1 ≤ i < j ≤ n} 分析: 有这样一个很有用的结论:gcd(x, n) = i的充要条件是gcd(x/i, n/i) = 1,因此满足条件的x ...