NSArray
版权声明:本文为博主原创文章,未经博主允许不得转载。
数组是一个元素有序、元素可重复的集合,在iOS编程中经常被用到,而Foundation框架提供了数组对象。数组对象包括不可修改的数组对象NSArray和可修改的数组对象NSMutableArray。
一、NSArray的创建和初始化
NSArray分别提供了类方法和实例方法来创建NSArray,两种方法需要传入的参数基本相似,一般类方法以array开头,而实例方法则以init开头。
类方法
创建一个空数组:+ (id)array;
创建具有一个元素的数组:+ (id)arrayWithObject:(id)anObject;
创建包含多个元素的数组:+ (id)arrayWithObjects:(id)firstObject, ...;
通过一个数组创建另一个数组:+ (id)arrayWithArray:(NSArray *)array;
读取文件内容来创建数组: + (id)arrayWithContentsOfFile:(NSString *)path;
读取URL内容来创建数组:+ (id)arrayWithContentsOfURL:(NSURL *)url;
实例方法
初始化具有一个元素的数组:- (id)initWithObject:(id)anObject;
初始化包含多个元素的数组:- (id)initWithObjects:(id)firstObject, ...;
通过一个数组初始化另一个数组:- (id)initWithArray:(NSArray *)array;
读取文件内容来初始化数组:- (id)initWithContentsOfFile:(NSString *)path;
读取URL内容来初始化数组:- (id)initWithContentsOfURL:(NSURL *)url;
示例
程序源代码
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建空数组
NSArray *arr1 = [NSArray array];
// 输出空
NSLog(@"arr1中包含的元素为:%@", arr1);
// 创建具有一个元素的数组
NSArray *arr2 = [NSArray arrayWithObject:@"apple"];
// 输出arr2中的内容为:apple
NSLog(@"arr2中包含的元素为:%@", arr2);
// 创建包含多个元素的数组
NSArray *arr3 = [NSArray arrayWithObjects:@"apple", @"banana", @"orange", nil];
// 输出arr3中的内容为:apple,banana,orange
NSLog(@"arr3中包含的元素为:%@", arr3);
// 通过一个数组创建另一个数组
NSArray *arr4 = [NSArray arrayWithArray:arr3];
// 输出arr4中的内容为:apple,banana,orange
NSLog(@"arr4中包含的元素为:%@", arr4);
// 读取文件内容来创建数组,注意:该文件需要保存在桌面上,并根据自己电脑的用户更改路径"chao"
NSArray *arr5 = [NSArray arrayWithContentsOfFile:@"/Users/chao/Desktop/myFile.txt"];
NSLog(@"arr5中包含的元素为:%@", arr5);
}
return 0;
}
输出结果
arr1中包含的元素为:(
)
arr2中包含的元素为:(
apple
)
arr3中包含的元素为:(
apple,
banana,
orange
)
arr4中包含的元素为:(
apple,
banana,
orange
)
arr5中包含的元素为:(
apple,
banana,
orange,
grape,
watermelon,
peach,
pear,
pitaya
)
二、NSArray的操作
判断数组是否包含某个指定元素:- (id)containsObject:(id)anObject;
计算元素的个数:- (unsigned)count;
获取首元素:- (id)firstObjectCommonWithArray:(NSArray *)otherArray;
获取最后一个元素:- (id)lastObject;
获取某个位置的数组元素:- (id)objectAtIndex:(unsigned)index;
获取一系列的数组元素:- (id)objectsAtIndexs:(NSIndexSet *)set;
在数组末尾添加元素:- (NSArray *)arrayByAddingObject:(id)anObject;
在数组的末尾添加另一个数组的所有元素:- (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray;
提取数组中某个范围的元素来创建另一个数组:- (NSArray *)subarrayWithRange:(NSRange)range;
比较两个数组中的元素是否相等:- (BOOL)isEqualToArray:(NSArray *)otherArray;
返回元素所在的位置:- (unsigned)indexOfObject:(id)anObject;
返回元素所在的位置:- (unsigned)indexOfObjectIdenticalTo:(id)anObject;
把数组转换为字符串:- (NSString *)componentsJoinedByString:(NSString *)separator;
字符串转换为数组:- (NSArray *)componentsSeparatedByString:(NSString *)separator;
数组转换为数据对象:- (NSData *)sortedArrayHint;
将数组的内容写入到文件中:- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
将数组的内容写入到URL中:- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile;
示例
程序源代码
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = @"banana";
// 创建一个包含3个元素的数组
NSArray *arr = [NSArray arrayWithObjects:@"apple", @"banana", @"orange", @"grape", @"watermelon",nil];
// 判断数组中是否包含指定元素
if ([arr containsObject:str] == YES) {
NSLog(@"数组arr中包含%@这个元素", str);
}
else {
NSLog(@"数组arr总不包含%@这个元素", str);
}
// 输出数组arr中的元素个数
NSLog(@"数组arr中一共有%ld个元素", arr.count);
// 输出数组arr中的首元素
NSLog(@"数组arr中的首元素为:%@", [arr firstObjectCommonWithArray:arr]);
// 输出数组arr中的最后一个元素
NSLog(@"数组arr中的最后一个元素为:%@", [arr lastObject]);
// 输出数组arr中第3个元素
NSLog(@"数组arr中第3个元素为:%@", [arr objectAtIndex:2]);
// 输出数组arr中从下标为1开始后面的2个元素
NSLog(@"%@", [arr objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]]);
// 在数组arr的末尾添加元素"peach"后输出该数组
NSLog(@"在数组arr末尾添加一个元素后arr为:%@", arr = [arr arrayByAddingObject:@"peach"]);
NSArray *arr1 = [NSArray arrayWithObjects:@"pear", @"pitaya", nil];
// 在数组arr的末尾添加另一个数组arr1的所有元素后,输出arr
NSLog(@"arr的末尾添加另一个数组arr1的所有元素后arr为:%@", arr = [arr arrayByAddingObjectsFromArray:arr1]);
// 提取arr数组中从下标6开始后的2个元素来创建另一个数组arr2,并输出arr2
NSArray *arr2 = [arr subarrayWithRange:NSMakeRange(6, 2)];
NSLog(@"arr2为:%@", arr2);
// 比较arr1和arr2是否相等
NSLog(@"arr1%@arr2", [arr1 isEqualToArray:arr2] == 1 ? @"等于" : @"不等于");
// 返回元素"orange"在arr中的位置
NSLog(@"orange在arr中的位置为:%ld", [arr indexOfObject:@"orange"]);
// 返回元素"grape"在arr中的位置
NSLog(@"grape在arr中的位置为:%ld", [arr indexOfObjectIdenticalTo:@"grape"]);
// 把数组arr转换为字符串输出
NSString *str2 = [arr componentsJoinedByString:@","];
NSLog(@"数组arr转换为字符串后为:%@", str2);
// 把字符串str2转换为数组arr3,并输出arr3
NSArray *arr3 = [str2 componentsSeparatedByString:@","];
NSLog(@"字符串str2转换为数组arr3后为:%@", arr3);
// 把数组arr3转换为数据对象并输出
NSData *arr3Data = [arr3 sortedArrayHint];
NSLog(@"%@", arr3Data);
// 把数组arr的内容写入到文件myFile1.plist中
[arr writeToFile:@"/Users/chao/Desktop/myFile1.plist" atomically:YES];
// 把数组arr的内容写入到URL中
[arr writeToURL:[NSURL fileURLWithPath:@"/Users/chao/Desktop/myFile2.plist"] atomically:YES];
}
return 0;
}
输出结果
数组arr中包含banana这个元素
数组arr中一共有5个元素
数组arr中的首元素为:apple
数组arr中的最后一个元素为:watermelon
数组arr中第3个元素为:orange
(
banana,
orange
)
在数组arr末尾添加一个元素后arr为:(
apple,
banana,
orange,
grape,
watermelon,
peach
)
arr的末尾添加另一个数组arr1的所有元素后arr为:(
apple,
banana,
orange,
grape,
watermelon,
peach,
pear,
pitaya
)
arr2为:(
pear,
pitaya
)
arr1等于arr2
orange在arr中的位置为:2
grape在arr中的位置为:3
数组arr转换为字符串后为:apple,banana,orange,grape,watermelon,peach,pear,pity
字符串str2转换为数组arr3后为:(
apple,
banana,
orange,
grape,
watermelon,
peach,
pear,
pitaya
)
<f79dc371 27a868cf 0260d3fc 94213fcf 48ad6e5c c60f2cc8 6c57c89e 0ef5d735>
三、NSMutableArray的创建和初始化
NSMutableArray继承了NSArray,因此它可以作为NSArray使用。NSMutableArray代表了集合元素可以改变的集合,因此可以向该集合添加、删除、替换集合的元素。NSMutableArray的创建和初始化方法与NSArray基本相同,不过它多了以下方法。
- 创建一个可变数组,并且为此数组分配固定大小的内存长度:+ (id)arrayWithCapacity:(unsigned)numItems;
- 初始化一个具有固定长度的可变数组:-(id)initWithCapacity:(unsigned)numItems;
四、NSMutableArray的操作
NSMutableArray相对NSArray主要新增了如下几个方面的方法:
- 增加集合元素的方法:这类方法以add开头。
- 删除集合元素的方法:这类方法以remove开头。
- 替换元素的方法:这类方法以replace开头。
- 对集合元素排序的方法:这类方法以sort开头。
- 插入新元素的方法:这类方法以insert开头。
下面是这几类方法声明:
向数组末尾增加元素:- (void)addObject:(id)anObject;
用可变数组来创建可变数组:- (void)addObjectsFromArray:(NSArray *)otherArray;
删除指定的元素:- (void)removeObject:(id)anObject;
删除可变数组中的所有元素:- (void)removeAllObjects;
删除可变数组中最后一个元素:- (void)removeLastObject;
删除可变数组中指定位置处的元素:- (void)removeObjectAtIndex:(unsigned)index;
删除可变数组中某一位置或某一范围的数组元素:- (void)removeObjectsAtIndex:(NSIndexSet *)set;
删除某个范围内的元素:- (void)removeObjectsInRange:(NSRange)range;
删除与另一个数组中相同的元素:- (void)removeObjectsInArray:(NSArray *)otherArray;
替换可变数组中某一位置的元素:- (void)replaceObjectAtIndex:(unsigned)index withObject:(id)anObject;
替换可变数组中多个元素:- (void)replaceObjectsAtIndexs:(NSIndexSet *)set withObjects:(NSArray *)otherArray;
替换某一范围内的元素:- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray;
在某一位置插入数组元素:- (void)insertObject:(id)anObject atIndex:(unsigned)index;
在某一位置或范围插入另一个数组元素:- (void)insertObjects:(NSArray *)otherArray atIndexs:(NSIndexSet *)set;
交换数组中两个数组元素的位置:- (void)exchangeObjectAtIndex:(unsigned)idx1 withObjectAtIndex:(unsigned)idx2;
对可变数组中的元素进行重新设置:- (void)setArray:(NSArray *)otherArray;
NSArray的更多相关文章
- 不可变数组NSArray
//数组里面不允许存放基本数据类型,只能存放“对象” NSArray *array = [NSArray arrayWithObjects:@"周星星",@"尹天仇&qu ...
- iOS NSArray数组过滤
需求:在一个数组里面,将在这个数组中的并且在另一个数组里面的元素过滤掉. 即:在一个数组dataArray里面,将在dataArray数组中的并且在filteredArray数组里面的元素过滤掉. / ...
- NSArray 倒序 输出
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@"3" ...
- Fouandation(NSString ,NSArray,NSDictionary,NSSet) 中常见的理解错误区
Fouandation 中常见的理解错误区 1.NSString //快速创建(实例和类方法) 存放的地址是 常量区 NSString * string1 = [NSString alloc]init ...
- 一段可以清理NSArray中的空对象的代码(递归)
- (NSArray *)clearAllNullObject{ NSMutableArray *array = [self mutableCopy]; ;i < array.count;i++ ...
- 一些NSArray,NSDictionary,NSSet相关的算法知识
iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...
- 如何删除NSDictionary或NSArray中的NSNull
前段时间与某公司的技术交流,被问到一个问题,如何删除NSDictionary中的NSNull.当时在纸上写,以前太依赖Xcode编译器了,以至于方法名都写不全,最终也没写出来,我想我肯定被鄙视的体无完 ...
- 放在NSArray、NSDictionary等容器内的对象Item,Item中的property在程序运行过程中被无故释放
可能是被释放的property本身是OC对象而它的属性被误写成assign,例如: @interface MyItem : Object @property (nonatomic, assign) N ...
- iOS 开发遇到的问题之(nil指针对NSDictionary及NSArray初始化的影响)
nil指针对NSDictionary及NSArray初始化的影响 最近在做项目的时候遇到一个挺坑的崩溃问题,是由于NSDictionary初始化时nil指针引起的崩溃.假设我们现在要初始化一个{key ...
随机推荐
- MVC Controller Dependency Injection for Beginners【翻译】
在codeproject看到一篇文章,群里的一个朋友要帮忙我翻译一下顺便贴出来,这篇文章适合新手,也算是对MEF的一个简单用法的介绍. Introduction In a simple stateme ...
- 国内其他的maven库
转自:http://www.cnblogs.com/woshimrf/p/5860478.html 在oschina关来关去的烦恼下,终于受不了去寻找其他公共库了. 阿里云maven镜像 <mi ...
- Visual Studio 插件的开发(转)
起因 在做项目的时候,经常需要根据表结构create一些实体类,写多了,实在是觉得无趣,于是就琢磨着做个代码生成工具.当然现在有很多现成的,拿来用就好,可是总想自己弄个出来玩玩,一来是当初用DataS ...
- jquery简单开始
老师讲好少,我也没办法. &(function(){ 执行完所有代码之后再执行这里的代码 }) 选择器: &('#id'); 获取id &('.class'); ...
- BestCoder Round #85(ZOJ1569尚未验证)
A题 子序列和啊,就要想到前缀和的差.这个转换一定要!记着!那么i到j的一段子序列和Sij%m == 0就等价于(Sj-Si-1)%m == 0 了,那么什么意思呢?就是如果有两段前缀和%m的模是一 ...
- 2015年ACM长春网络赛(准备做掉7道:已经更新到6道)
总结汇总:模板 int getmax_min(char s[]) {//字符串的最大表示法:返回最小数组下标 , j = , k = ; while(i < len && j & ...
- Objective-C 中self.与_访问方式的区别
Objective-C中属性self.a与_a访问的区别: 在OC中我们可以通过指令@property定义属性. OC对属性封装了许多方法,同时也会自动实现一些方法,相比实例变量,感觉更加面向对象些. ...
- 基于Proteus仿真的Arduino学习(1)——Arduino Uno最小系统及LED的简单使用
一.前言: A.Arduino简介 Arduino是由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Banzi.David Cuartielles.Tom Igoe.Gianluc ...
- ZeroMQ接口函数之 :zmq_disconnect - 断开一个socket的连接
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_disconnect zmq_disconnect(3) ØMQ Manual - ØMQ/3.2.5 Name ...
- linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记
上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...