Objective-C学习篇07—NSArray与NSMutableArray
大纲
NSArray
NSMutableArray
快速枚举
NSArray
NSArray是一个静态数组,也就是一个不可变数组,一旦创建以后,就不能进行添加,删除或者修改其中的元素.NSArray继承自NSObject,用于管理一系列有序对象的集合,可以通过对象在数组中的位置(索引)来访问对象.和C语言一样,数组中元素的索引是从0开始的.数组中既可以用于存放同一个类的对象,也可以用于存储不同类的对象.但不能存放nil,nil被视为数组结束的标志,系统会在方法末尾自动生成.
切记:NSArray中只能存放对象类型的数据,不能存储C语言中的基本数据类型,比如int,float等;
NSArray的常用方法
创建
1. 创建一个空数组 init
便利构造器方法 array
NSArray *arr = [[NSArray alloc] init]; NSArray *arr0 = [NSArray array];
注意:不可变数组一经创建便不能再修改其内容,但是其数组指针可以改变,可以重指向.空数组创建后里面没有内容,貌似没有什么意义,但它的数组指针可以用于重指向.
2. 自定义创建一个拥有对象的数组 initWithObjects:
NSArray *arr = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", nil]; NSLog(@"%@", arr);
便利构造器方法创建数组 arrayWithObjects:
NSArray *arr1 = [NSArray arrayWithObjects:@"d", @"e",@"f", nil]; NSLog(@"%@", arr1);
3. 用已有的数组中的对象来初始化并返回一个新的数组 initWithArray:
NSArray *arr3 = [[NSArray alloc] initWithArray:arr]; NSLog(@"%@", arr3);
便利构造器方法 arrayWithArray:
NSArray *arr4 = [NSArray arrayWithArray:arr1]; NSLog(@"%@", arr4);
4. 访问
// 返回数组中的元素 count NSUInteger count = arr1.count; // arr1.count 相当于 [arr1 count] NSLog(@"count = %lu", count); // 访问数组中的第一个元素 firstObject NSString *firstObject = arr1.firstObject; // 访问数组中最后一个元素 lastObject NSString *lastObject = arr1.lastObject; NSLog(@"fistObject = %@ lastObject = %@", firstObject, lastObject); // 根据下标返回数组中元素 objectAtIndex: NSString *str = [arr objectAtIndex:]; NSLog(@"%@", str);
5.排序 sortedArrayUsingSelector: (SEL)comparator
NSArray的排序方法会返回一个新的数组,新数组是对旧数组中的元素经过选择器selector排序后的数组.
NSArray *array = [NSArray arrayWithObjects:", nil]; NSArray *sortArray = [array sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@", sortArray);
打印结果:
-- :::] (
,
,
,
,
)
利用sortedArrayUsingSelector: (SEL)comparator 方法对数组中的对象逐个进行比较,并根据比较的结果生成一个新的数组.
数组对象之间比较的时候使用选择器comparator指定的方法,选择器要求有一个输入参数,返回值是NSComparisonResult类型,例如如果要对一个NSString的NSArray进行排序的话,选择器可以使用NSString的方法compare:
NSArray *newArray = [anArray sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray
NSMutableArray 可变数组 ,继承自NSArray,所以它可以使用NSArray中定义的全部方法.NSMutableArray数组中存放的内容是可以改变的,添加 删除 替换
创建
可变数组的初始化 initWithCapacity:<#(NSUInteger)#> (NSInteger指定了数组的长度)
便利构造器方法 arrWithCapacity:<#(NSUInteger)#>
NSMutableArray *mArr = [[NSMutableArray alloc] initWithCapacity:]; NSMutableArray *mArr2 = [NSMutableArray arrayWithCapacity:];
追加
1. 向可变数组中添加元素到数组末尾 addObject:
[mArr addObject:@"HarbingWang"];
2. 将其他数组中的元素全部添加到数组末尾 addObjectsFromArray:
//例如:现有如下数组insertArray,将其添加到上面创建好的空数组mArr2中
NSArray *insertArray = [NSArray arrayWithObjects:@"Manager", @"productDog", @"marketMonkey", @"operationMouse", @"serviceCattle", @"programmingApe", @"designLion", nil]; [mArr2 addObjectsFromArray:insertArray]; NSLog(@"%@", mArr2);
打印结果:
-- :::] (
Manager,
productDog,
marketMonkey,
operationMouse,
serviceCattle,
programmingApe,
designLion
)
3. 添加元素到指定的位置 insertObject: atIndex:
[mArr2 insertObject:]; NSLog(@"%@", mArr2);
打印
-- :::] (
Manager,
productDog,
marketMonkey,
operationMouse,
serviceCattle,
programmingApe,
ziChaoZhe,
designLion
)
*由打印结果可知:insertObject:是添加anObject到指定的index位置,后面的元素顺次后移,index必须在0和数组范围之间,否则会出出现越界的问题,程序Crash
4. 交换数组中的两个元素 exchangeObjectAtIndex:<#(NSUInteger)#> withObjectAtIndex:<#(NSUInteger)#>
[mArr2 exchangeObjectAtIndex: withObjectAtIndex:];
5. 删除
. 删除数组中指定位置处的元素 removeObjectAtIndex: [mArr2 removeObjectAtIndex:]; . 删除指定的对象 找到了就删除,找不到就不删除,原样输出 removeObject: [mArr2 removeObject:@"Manager"]; . 删除最后一个元素 removeLastObject [mArr2 removeLastObject]; . 删除数组中所有的元素 removeAllObjects
[mArr2 removeAllObjects];
9.排序 sortUsingSelector:
[mArr2 sortUsingSelector:@selector(compare:)]; NSLog(@"%@", mArr2);
打印:
-- :::] (
designLion,
marketMonkey,
operationMouse,
productDog,
programmingApe,
serviceCattle,
ziChaoZhe
)
快速枚举 forin
OC提供了一个用于遍历容器类(数组,词典,集合等)的语法,叫做快速枚举(fast enumeration),也就是增强型for循环,在使用该语法时不需要关心集合中元素的个数, 我们通常将其叫做forin语法.语法如下:
for (<#type *object#> in <#collection#>) {
<#statements#>
}
参数:
<#type *object#> :集合中的对象类型 对象类型的指针变量
<#collection#> :集合对象名
<#statements#> :循环体(相应的处理)
好处: OC 提供的快速枚举(增强型for循环),不需要再关心集合中元素的个数
执行步骤: 每一次循环把集合的元素取出来赋值给指针变量
尤其值得注意的是: 在快速枚举过程中,不能修改集合中的元素,因此不要在循环体中加入能引起集合发生改变的操作,否则,系统便会抛出异常
遍历容器中的元素的顺序与容器的类型相关.如果是数组类型,就会从头开始遍历,而如果是集合或者词典,遍历的顺序则与容器的内部实现有关.具体后面将会有所涉及.
for (NSString *string in mArr2) {
// [mArr5 removeObject:string]; // 这样写系统会报错: was mutated while being enumerated 快速枚举的时候修改了集合中的内容,此时就会造成Crash
NSLog(@"%@", string);
}
打印
-- :::] designLion -- :::] marketMonkey -- :::] operationMouse -- :::] productDog -- :::] programmingApe -- :::] serviceCattle -- :::] ziChaoZhe
初学者在使用此语法时,比较困难的是第一个参数<#type *object#>和第二参数<#collection#>如何写?
在这里,<#type *object#>是一个变量,由于forin在执行的时候是把要遍历的集合中的元素依次取出来赋值给这个指针变量,因此这个变量的类型必须与集合中对象的类型保持一致,比如说上例中数组mArr2中的元素都是字符串NSString类型的,因此应当搞一个数组型的变量string来接收.如果是Person对象的变量就要搞一个Person*类型的变量来存储.而<#collection#>则是要遍历的集合,这个很容易理解.
Objective-C学习篇07—NSArray与NSMutableArray的更多相关文章
- 【从零开始自制CPU之学习篇07】最简单的ALU—全加器
ALU是算术逻辑单元,是CPU中重要的一部分,因为CPU本质上就是不断重复最简单的计算.而我们这一版CPU的ALU部分更为简单,是一个只能做加法的ALU. 理论部分 我们需要一个能帮我们进行数学计算的 ...
- iOS阶段学习第15天笔记(NSArray与NSMutableArray 数组)
iOS学习(OC语言)知识点整理 一.OC中的数组 1)数组:也是一个对象,数组中存放的是对象的地址,可以存放任意类型对象的地址,只能是对象不能是具体的数值,数组是有序的, 可以存放重复的元 ...
- OC学习篇之---总结和学习目录
今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...
- iOS系列 基础篇 07 Action动作和输出口
iOS系列 基础篇 07 Action动作和输出口 目录: 1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...
- (转载)OC学习篇之---概述
前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...
- python-基础学习篇(一)
python基础学习(一) 不积硅步,无以至千里.基础的学习越加透彻,才能更清楚的理解和分析需求,我贯彻基础学习“永无止境”的理念,故把自学的知识梳理在博客中,基础学习篇无限更新. python介绍 ...
- js学习篇1--数组
javascript的数组可以包含各种类型的数据. 1. 数组的长度 ,直接用 length 属性; var arr=[1,2,3]; arr.length; js中,直接给数组的length赋值是会 ...
- IOS数组NSArray与NSMutableArray知识点
此文是对数组NSArray与NSMutableArray知识点的总结,主要是一些常见的操作,别外一些操作见其相应的文档,下面的代码部分还运用的第三方插件BlocksKit相结合: a:Foundati ...
- NSArray和NSMutableArray
//1. NSArray EOItems *eOItems = [[EOItems alloc] init]; eOItems.ID = [NSNumber numberWithInt:]; NSAr ...
随机推荐
- android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问
谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线 ...
- node.js使用经验记录
MongoDB使用经验: 有时不知道MongoDB的错误码代表什么,那有这个链接: https://github.com/mongodb/mongo/blob/master/src/mongo/bas ...
- 关于SD卡
http://blog.csdn.net/androidwifi/article/details/17725989 http://www.cnblogs.com/greatverve/archive/ ...
- 使用MFC开发有十多年了,结合自身的体会,随便说几句(不能样样都依赖别人,C体系的人,绝对不怕人踢馆)
挺长时间了吧,这个帖子还没沉下去,使用MFC开发有十多年了,结合自身的体会,随便说几句:1.MFC是一个C++的基础类库,封装了绝大多数的API函数,主要是用来创建带UI的应用程序,服务端程序或着不带 ...
- android手机游戏开发Cocos2d-x开发分享
我想现在应该没有人没有玩过手机游戏了吧,当然所有人都玩过,但不是所有人都知道怎么去开发手机游戏,因为许多人都感觉做开发是一件很困难的事儿,身边的朋友也对此感觉难度很大.但是,现在我可以告诉你,手机游戏 ...
- IBM Intel 微软
IBM是全球IT第一巨头,也是一个很奇特也很强大强大的公司,从螺丝钉键盘鼠标到CPU硬盘内存到大型机巨型机,它都可以制造,从软件到硬件到服务,它都可以提供,这在IT历史上,是否绝后我不敢说,空前应该是 ...
- git bash中避免在push时反复输入用户名和密码
我用的是windows系统,这几天学着使用git时发现每次使用git push时每次都要输入一遍用户名和密码,感觉特烦,特意上网查了下,找到了简化方法.虽然不是原创,但至少算是加了点自己的心得和经验吧 ...
- java中字符串的比较
compareTo方法是比较两个字符串的词典顺序 也就是在字典中的顺序,比如“abcd”在“acdb”前面 大于返回1,小于返回-1 equals:比较两字符串的内容是否相同. 相同返回1,不同返回 ...
- C#经典系列-键值对
1.ToDictionary,ToLookup 从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,用的是非常非常多 我们有这样的一个实体 class student { publ ...
- GC与显式内存管理
C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新.然而,从这两年的效果而言,C++的复兴并没有发生.一方面随着世界经 ...