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:0];
NSLog(@"%@", str);

  5.排序 sortedArrayUsingSelector: (SEL)comparator

  NSArray的排序方法会返回一个新的数组,新数组是对旧数组中的元素经过选择器selector排序后的数组.

NSArray *array = [NSArray arrayWithObjects:@"4", @"1", @"5", @"2", @"3", nil];
NSArray *sortArray = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", sortArray);

  打印结果:

     2015-11-29 19:43:36.314 Myself[804:76839] (
     1,
     2,
     3,
     4,
     5
     )

  利用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:0];
NSMutableArray *mArr2 = [NSMutableArray arrayWithCapacity:0];

  追加

  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);

  打印结果:

     2015-11-29 20:17:21.708 Myself[836:94080] (
     Manager,
     productDog,
     marketMonkey,
     operationMouse,
     serviceCattle,
     programmingApe,
     designLion
     )

  3. 添加元素到指定的位置 insertObject: atIndex:

[mArr2 insertObject:@"ziChaoZhe" atIndex:6];
 NSLog(@"%@", mArr2);

打印

     2015-11-29 20:21:19.615 Myself[879:95624] (
     Manager,
     productDog,
     marketMonkey,
     operationMouse,
     serviceCattle,
     programmingApe,
     ziChaoZhe,
     designLion
     )

*由打印结果可知:insertObject:是添加anObject到指定的index位置,后面的元素顺次后移,index必须在0和数组范围之间,否则会出出现越界的问题,程序Crash

  4. 交换数组中的两个元素 exchangeObjectAtIndex:<#(NSUInteger)#> withObjectAtIndex:<#(NSUInteger)#>

 [mArr2 exchangeObjectAtIndex:0 withObjectAtIndex:1];

  5. 删除

5. 删除数组中指定位置处的元素  removeObjectAtIndex:
[mArr2 removeObjectAtIndex:1];

6. 删除指定的对象 找到了就删除,找不到就不删除,原样输出 removeObject:
[mArr2 removeObject:@"Manager"];

7. 删除最后一个元素  removeLastObject  
[mArr2 removeLastObject];

8. 删除数组中所有的元素  removeAllObjects
[mArr2 removeAllObjects];

  9.排序  sortUsingSelector:

[mArr2 sortUsingSelector:@selector(compare:)];
NSLog(@"%@", mArr2);

  打印:

     2015-11-29 20:51:12.980 Myself[1013:107642] (
     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);
}

  打印

2015-11-29 21:01:16.206 Myself[1022:111865] designLion
2015-11-29 21:01:16.206 Myself[1022:111865] marketMonkey
2015-11-29 21:01:16.220 Myself[1022:111865] operationMouse
2015-11-29 21:01:16.220 Myself[1022:111865] productDog
2015-11-29 21:01:16.220 Myself[1022:111865] programmingApe
2015-11-29 21:01:16.220 Myself[1022:111865] serviceCattle
2015-11-29 21:01:16.221 Myself[1022:111865] ziChaoZhe

  初学者在使用此语法时,比较困难的是第一个参数<#type *object#>和第二参数<#collection#>如何写?

  在这里,<#type *object#>是一个变量,由于forin在执行的时候是把要遍历的集合中的元素依次取出来赋值给这个指针变量,因此这个变量的类型必须与集合中对象的类型保持一致,比如说上例中数组mArr2中的元素都是字符串NSString类型的,因此应当搞一个数组型的变量string来接收.如果是Person对象的变量就要搞一个Person*类型的变量来存储.而<#collection#>则是要遍历的集合,这个很容易理解.

时间: 2024-10-15 10:55:21

Objective-C学习篇07—NSArray与NSMutableArray的相关文章

IOS阶段学习第15天笔记(NSArray与NSMutableArray 数组)

IOS学习(OC语言)知识点整理 一.OC中的数组 1)数组:也是一个对象,数组中存放的是对象的地址,可以存放任意类型对象的地址,只能是对象不能是具体的数值,数组是有序的,      可以存放重复的元素,数组也分为不可变数组和可变数组.       1.不可变数组NSArray:初始化之后不能修改数组的内容       2.可变数组NSMutableArray:可以随时修改数组的内容(增加元素.删除元素.修改元素) 二.NSArray数组的操作 1)NSArray数组的创建 1.创建方法一:使用

OC学习篇之---总结和学习目录

今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请OC老鸟来喷~~ 1.OC学习篇之---概述 2.OC学习篇之---第一个程序HelloWorld 3.OC学习篇之---类的定义 4.OC学习篇之---类的初始化方法和点语法的使用 5.OC学习篇之---类的三大特性(封装,继承,多态) 6.OC学习篇之[email protected]关键

OC学习篇之---概述

前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲了,当然我们知道,Android是Java语言支撑的,iOS是OC支撑的,关于OC的学习,会和Java相对比这来,这样效率也会高点,同时在大学里学了C/C++所以,学习OC就没什么难度了,就是一套新的api. 概述 目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会

(转载)OC学习篇之---概述

前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲了,当然我们知道,Android是Java语言支撑的,iOS是OC支撑的,关于OC的学习,会和Java相对比这来,这样效率也会高点,同时在大学里学了C/C++所以,学习OC就没什么难度了,就是一套新的api. 概述 目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会

iOS系列 基础篇 07 Action动作和输出口

iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮,下面呢 我们通过一个具备用户交互功能的工程案例进一步练习这两个控件的使用,以及动作和输出口的控制. 此案例基于上篇内容的界面设计,功能的概念流程如图: 此案例的动作和输出口机制如图: 2. 什么是动作? 动作是为了响应一个控件的事件而定义的方法,类似于.NET中WinForm为控件某一事件添加的动

Ext.Net学习笔记07:Ext.Net DirectMethods用法详解

前面两篇内容中,我们看到了DirectEvents方便调用服务器端方法.DirectEvents调用WebService方法的使用方法,今天我们来看看DirectMethods,这家伙可比DirectEvents更加灵活了,它可以像调用JS方法一样来异步调用服务器端的方法. 使用DirectMethods在JS中调用C#方法 我承认,这个标题有点噱头,其实应该是通过DirectMethods,在JS中通过异步调用的方式执行服务器端的方法. 来看一个例子吧: [DirectMethod] publ

Linux新手入门书籍推荐 鸟哥的linux私房菜-基础学习篇

这本书写的不错.赞~\(≧▽≦)/~ 2017-02-24 下午,我开始在Linux下写第一个.c程序,在终端打印hello world.gcc 源代码文件之后,输出可执行文件,但是 当我输入文件名执行它的时候,却提示我 无法找到命令.于是我找百度,查资料,花了半个小时,终于找到解决方法了, 输入"./filename"即可.... 2017-02-25 我看<基础学习篇>这本书,在P158页下面的例题讲解中找到了昨天下午异常的解析.我就很是感慨,心想:要是早看这本书,半个

Foundation框架中NSArray和NSMutableArray

=================== NSArray ====================(不可变数组,一旦建立就不能被更改) Ordered collection of objects. Immutable(you cannot add or remove objects to it once it’s created)Important methods:+ (id)arrayWithObjects:(id)firstObject, ...;    // nil terminated -

嵌入式学习_AD学习篇

AD基础使用: 1.建立一个工作区 (.DsnWrk) workspace 2.建立一个PCB工程(.PrjPCB)  project 3.建立一个PCB原理图文件(理论上告诉你两个点连接起来) 建立原理图后需要编译一下,没问题再倒入pcb文件.(.SchDoc)  schemmatic 4.建立一个PCB文件(物理上两个点怎么连)(.PcbDoc) 5.Layout(先布局再布线最后电器规格检查(DRC检查)) 6.生成Gerber文件(G1,G2,GBL,GBO,GBP,GBS,GKO,GP