黑马程序员_IOS开发_Objective-C学习笔记_NSArray/NSMutableArray

1.数组简介

NSArray:用来存储有序数组,它是不可变的(不能插入删除数据元素),也不能存储C语言中的基本数据类型(int、float、double、enum、struct),也不能存nil,如果需要使用基本数据类型,需要先转成Objective-c中的对象,用@包装下。

NSMutableArray:它是可变的(可以插入删除数据元素),还能限制元素个数 capacity。当你需要对数组元素进行加减操作的时候,就需要使用NSMutableArray。

2.创建数组

//1.array
NSArray * array = [NSArray array];
//2.arrayWithArray:
NSArray * array1 = [NSArray arrayWithArray:arr];
//3.arrayWithObject:
NSArray * array3 = [NSArray arrayWithObject:@"IOS"];
//4.arrayWithObjects:
NSArray * array4 = [NSArray arrayWithObjects:@"IOS", @"Android", nil];
//5.arrayWithObjects:count:
NSString * string5[3] = {@"IT", @"hei", @"ma"};
NSArray * array5 = [NSArray arrayWithObjects:string5 count:2]; //获取数量
//6.init
NSArray * array6 = [[NSArray alloc] init];
array6 = @[@"LLL", @"IIII", @"BBBB"];
[array6 release]; //对象需要进行内存释放
//7.initWithArray:
NSArray * array7 = [[NSArray alloc] initWithArray:array6];
[array7 release];
//8.initWithObjects:
NSArray * array8 = [[NSArray alloc] initWithObjects:array6, array5, nil];
//9.initWithObjects:count:
NSArray * array9 = [[NSArray alloc] initWithObjects:string5 count:1];
[array9 release];
//10.arrayWithCapacity //初始化可变数组对象的长度
NSMutableArray *array10 = [NSMutableArray arrayWithCapacity:10];
//11.initWithCapacity
NSMutableArray * array11 = [[NSMutableArray alloc] initWithCapacity:10];

可以使用下面的方式创建数组,并且无需担心内存

NSArray *array2 = @[@"itheima", @"itcast", @"HM2015"];

3.数组删除(NSMutableArray)

//1.removeAllObjects 删除数组中所有的Objects
NSMutableArray *list = [[NSMutableArray alloc] init];
Person *car = [[Person alloc] init];
car.price = 10;
car.color = 1;
Person *car1 = [[Person alloc] init];
car1.price = 120;
car1.color = 12;
[list addObject:car];
[list addObject:car1];
NSLog(@"%@", list);
[list removeAllObjects]; // Crash here
 NSLog(@"%@", list);

//2.removeLastObject 删除最后一个object
[list removeLastObject];
NSLog(@"%@", list);

//3.removeObject: //删除指定Object
[list removeObject:car];
NSLog(@"%@", list);

//4.removeObject:inRange: //在指定范围删除car1
NSRange range = {1, 1};
[list removeObject:car1 inRange:range];
NSLog(@"%@", list);

//5.removeObjectAtIndex:  //删除指定下标的object
[list removeObjectAtIndex:3];

//6.removeObjectsInArray: //删除在数组中出现的Object
NSArray * arr00 = @[car];
[list removeObjectsInArray:arr00];
NSLog(@"%@", list);

//7.removeObjectsInRange: //删除指定范围的Object
[list removeObjectsInRange:range];
NSLog(@"%@", list);
[list release];

4.数组修改(NSMutableArray)

//1.arrayByAddingObject 向数组添加值返回新的数组
NSArray * array = @[@"itheima", @"itcast", @"HM2015"];
NSString * string11 = @"new start";
NSLog(@"%@", [array arrayByAddingObject:string11]);

//2.arrayByAddingObjectsFromArray 组合两个数组

NSLog(@"%@", [array arrayByAddingObjectsFromArray:array]);

//3.componentsJoinedByString 数组切成字符串
NSLog(@"%@", [array componentsJoinedByString:@","]);

//4.addObject 向数组添加对象
NSMutableArray * array4 = [NSMutableArray arrayWithObjects:@"itheima", @"itcast", nil];
[array4 addObject:@"CCC"];
NSLog(@"%@", array4);

//5.addObjectsFromArray 向数组中添加格式化数组
[array4 addObjectsFromArray:array];
NSLog(@"%@", array4);

//6.insertObject:atIndex 在指定下标添加对象
[array4 insertObject:@"OOO" atIndex:1];
NSLog(@"%@", array4);

//7.replaceObjectAtIndex:withObject 替换指定下标的元素
[array4 replaceObjectAtIndex:1 withObject:@"ppp"];
NSLog(@"%@", array4);

//8.setArray 替换原数组
NSArray * array8 = @[@"A", @"B", @"C"];
[array4 setArray:array8];
NSLog(@"%@", array4);

//9.exchangeObjectAtIndex:withObjectAtIndex 交换指定下标的元素
[array4 exchangeObjectAtIndex:1 withObjectAtIndex:2];
NSLog(@"%@", array4);

5.数组查询

NSString * string = @"CCC";
NSArray * array = @[str];
//1.containsObject   是否包含指定对象
if ([array containsObject:string]) {
    NSLog(@"array 包含 string");
}

//2.count  数组中所含元素个数,不包括 nil
NSArray * array2 = [NSArray arrayWithObjects:@"AAA", @"BBBB", nil];
NSLog(@"count = %zi", array2.count);

//3.getObjects:range:
//4.firstObject 返回两个数组中第一个相同的对象元素
NSMutableArray * array4 = [NSMutableArray arrayWithObjects:@"aaa", @"bbbb", nil];
NSLog(@"%@", [array4 firstObjectCommonWithArray:array4]);

//5.lastObject  返回数组最后一个元素
NSMutableArray * array5 = [NSMutableArray arrayWithObjects:@"aaa", @"bbbb", @"ccc",nil];
NSLog(@"%@", [array5 lastObject]);

//6.objectAtIndex 返回指定索引的元素
NSLog(@"%@", [array5 objectAtIndex:1]);

//7.indexOfObject  返回指定对象的下标
NSLog(@"%li", [array5 indexOfObject:@"bbbb"]);

//8.indexOfObject:inRange 返回范围内指定对象的下标
NSRange range = NSMakeRange(0, 3);
NSLog(@"%li", [array5 indexOfObject:@"ccc" inRange:range]);

//9.subarrayWithRange: 截取范围内的数组元素
NSLog(@"%@", [array5 subarrayWithRange:range]);

6.数组比较

//1.isEqualToArray 比较两个数组元素是否相等
if ([array5 isEqualToArray:array5]) {
    NSLog(@"array5 equal array5");
}

7.数组遍历

1.for循环遍历
NSUInteger count = array2.count;
for (int i = 0; i < count; i ++) {
    NSLog(@"%@", [array2 objectAtIndex:i]);
}

2.for in 遍历
for (id obj in array2) {
    NSLog(@"%@", obj);
}

8.NSArray 文件读写

1.writeToFile写文件,会保存为XML格式的文件。
NSArray * array = @[@"AAA", @"BBB"];
NSString * path = @"/Users/simman/NSarray.xml";
[array writeToFile:path atomically:YES];

2.arrayWithContentsOfFile:path 读文件(规定格式(如:xml)转数组)
NSArray * array1 = [NSArray arrayWithContentsOfFile:path];
NSLog(@"%@", array1);

9.数组的内存管理

要说明数组的内存管理,我们可以使用类来做演示。
9.1创建Person类

//创建Person类,并复写dealloc方法,使之能打印出当前释放的对象
- (void)dealloc {
    NSLog(@"%@ is released", self);
    [super dealloc];
}

9.2创建三个Person的对象

Person *p1 = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
Person *p3 = [[Person alloc] init];

9.3把三个对象放进数组 array 里

NSArray * array = [[NSArray alloc] initWithObjects:p1, p2, p3, nil];

9.4打印p1 p2 p3的计数器

NSLog(@"p1_RetainCount = %zi,  p1.retainCount);
NSLog(@"p2_RetainCount = %zi", p2.retainCount);
NSLog(@"p3_RetainCount = %zi", p3.retainCount);

控制台输出:
2015-04-10 16:13:19.012 objective-c——NSArray[11579:303] p1_RetainCount = 2
2015-04-10 16:13:19.014 objective-c——NSArray[11579:303] p2_RetainCount = 2
2015-04-10 16:13:19.016 objective-c——NSArray[11579:303] p3_RetainCount = 2

9.5释放p1 p2 p3对象

[p1 release];
[p2 release];
[p3 release];

9.6释放array数组

[array release];

2013-10-18 16:01:01.111 objective-c——NSArray[11543:303] &lt;person: 0x10010a2b0> is released
2013-10-18 16:01:01.112 objective-c——NSArray[11543:303] &lt;/person:>&lt;person: 0x100109a50> is released
2013-10-18 16:01:01.112 objective-c——NSArray[11543:303] &lt;/person:>&lt;person: 0x100108c00> is released

9.7总结
当把对象放进数组中,该对象将执行retain,计数器将 + 1
当数组 release 的时候,会对所有数组元素做 release 操作。

时间: 2024-07-30 13:47:43

黑马程序员_IOS开发_Objective-C学习笔记_NSArray/NSMutableArray的相关文章

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

黑马程序员_IOS开发_Objective-C学习笔记_类(对象)

1.面向对象编程基本介绍: 面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法.对象指的是类的集合,类是对象的模板,它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的安全性.重用性.灵活性和扩展性. 2.面向对象与面向过程 面向过程就是分析出解决问题所需要的步骤,然后基于这些步骤用代码和函数把这些步骤一步一步实现. 面向对象是把构成问题事务分解成各个对象,然后各个对象分别对相关的程序功能做出处

黑马程序员_IOS开发_Objective-C学习笔记_基本数据类型

 1.数据类型和常量: 我们在做IOS程序开发的时候使用的最多的恐怕就是基本数据类型,在Objective-c中提供了4种基本的数据类型:int float double以及char. 1.1声明为int的变量只能用于保存整形值. 1.2声明为float类型的变量可存储浮点类型值(即包含小数位数).. 1.3double类型和float类型一样,只不过前者的精度大约是后者的2倍. 1.4最后是char 数据类型,char类型可用来存储单个字符,例如字母a,数字6,或是一个分号.或者通过char指

黑马程序员_IOS开发_Objective-C学习笔记_NSString

NSString NSString是一个IOS OC开发中经常使用到得一个对象类型.NSString是NSObject(Foundation的基础对象)的子类,所以具有NSObject的所有特性. NS是Cocoa类对象类型的前缀,来源于乔布斯公司的操作系统的名字 NEXTSTEP 1.创建NSString对象1.1此方法不需要手动释放内存. NSString *aString = @"This is String"; //注意:这里和C语言字符串不一样,需要在头部放一个@符号 1.2

黑马程序员_IOS开发_Objective-C学习笔记_分析和调试自己的一个黑马基础测试题程序

1.程序 1.1程序介绍 从键盘输入6个字符串(仅仅包含英文字母和数字),对着6个字符串从小到大排列并输出结果.(C语言) 1.2程序设计分析 这个是我在基础测试题目环节从黑马报名系统里面下得题目. 初看题目,觉得此题不难,无非是: *建立一个字符串的数组 *然后在一个循环6次的循环体里面循环输入6次,然后再把输入的字符串放到字符串数组里面 *然后建立一个长度数组来统计相对应的字符串的长度 *最后对长度数组中的元素按大小来排序(注意:对长度数组中的元素排序的时候,同时要对字符串数组进行一样的操作

黑马程序员_IOS开发_Objective-C学习笔记_Foundation框架常用的结构体

1.Foundation框架简介 1.1使用Foundation可以: *创建和管理集合,比如数组和字典 *访问存储在应用程序里的图片和其它资源 *创建和管理字符串 *提交和接收通知 *创建日期和时间对象 *自动发现IP网络上的设备 *操作URL流 *执行异步代码 注意:Foundation框架是默认导入的 所以不用刻意去导入 是必备的框架之一 1.2Foundation框架中一些经常接触到的结构体 由于Objective-C程序中 对象的结构体成员变量中的元素 不能通过对象直接来访问 所以我们

黑马程序员_IOS开发_Objective-C学习笔记_继承和分类

1.什么是继承 继承是面向对象程序的三大特征之一,意思是基于一个类的基础,定义一个新类. 被继承的类成为父类,新类成为子类. 继承的实际例子有许多.例如,一个儿子继承了他父亲,那么他就继承了他父亲的财产. 例如基类是Person,那么我们可以继承Person这个类,产生新的子类Student,Teacher 在这里Person是Student类和Teacher类的父类. 引入继承的概念是有许多好处的: *能够抽取重复代码 *建立了类和类之间的联系 *不改变原来模型的基础上,能够扩展出新的方法 2

黑马程序员_IOS开发_Objective-C学习笔记_指针复习

1.指针 上一篇我在分析我自己写的程序错误里面发现是指针的问题,我觉得有必要在复习一下指针,毕竟指针是C语言系列的难点. 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移对指针的概念和使用越加模糊,感觉指针难以掌握,今天我就再回顾下指针的概念和使用. 2.什么是指针 指针的本质是存放变量地址的变量,简单的说变量p中存储的是变量a的地址,那么p就可以称为是变量a的指针,或者说p指向a.当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对

黑马程序员_IOS开发_Objective-C学习笔记_内存管理

1.内存管理概述 1.1什么是内存管理:内存管理是程序设计中常用的资源管理的一部分,每个计算机系统可供程序使用的内存都是有限的. 1.2为什么要使用内存管理:当我们的程序运行结束的时候,操作系统将回收其我们程序占用内存.但是,只要程序还在运行,它就会一直占用内存.如果不进行及时清理不用的内存,内存最终将被耗尽.每个程序都会使用内存,我们必须确保在需要的时候分配内存,而在程序运行结束时释放占用的内存.如果我们只分配而不释放内存,将发生内存泄漏. 1.3引用计数:1.3.1只有当你对一个对象了all