天天看点

Objective-C中的NSArray、NSMutableArray、NSNumber详解

——–NSArray——–

NSArray是Foundation框架中的重要组成部分,存储多个数据的,具备数组的能力,所以,NSArray是OC中的数组。特点是只能存储OC对象!

特点:

1.基本数据类型不能放到NSArray中;

2.长度是固定的,一旦数组创建完毕之后,元素的长度固定,无法新增,也无法删除元素;

3.每一个元素都是紧挨着的,每一个元素都仍然有自己的下标;

4.元素的类型是id类型。

1). 创建方式

NSArray *arr1 = [NSArray new];
NSArray *arr2 = [[NSArray alloc] init];
NSArray *arr3 = [NSArray array];//以上3种方法创建出来的数组长度为0,没有任何意义!
NSArray *arr4 = [NSArray arrayWithObject:@"jack"];//只有1个元素
//最常用的创建数组的方式是
NSArray *arr5 = [NSArray arrayWithObjects:@"jack",@"rose",@"lili",@"lilei",@"hanmeimei",@"ligang",nil];//最后一个元素后一定要写一个nil表示结束
NSArray *arr6 = [NSArray arrayWithObjects:@"jack",nil,@"lili",@"lilei",@"hanmeimei",@"ligang",nil];//只有一个元素,碰到nil就结束
NSArray *arr7 = @[@"jack",@"rose",@"lili",@"ligang"];//快速创建,这种情况最后不用加nil,不然报错
           

2). NSArray数组的使用方法

在NSLog当中直接使用%@就可以打印整个数组内容。

可以利用下标进行访问,NSLog(@”%@”,arr[0]);

等同于方法[arr obejctAtIndex: 0];

arr.count//数组元素的个数,点语法
(BOOL)[arr containsObject:@"lili"]//查看数组中是否存在lili元素
arr.firstObject
arr.lastObject//取第一个和最后一个元素,注意与arr[0]有区别,如果数组为空,用下标访问报错,而firstObject方法返回nil
(NSUInteger)[arr indexOfObject:@"rose"]//查找元素rose在数组中第一次出现的下标,如果没有找到返回NotFound。
           

3). 遍历

//第一种方式:使用C语言中的for循环
//第二张方式:使用增强for循环,类似C++中auto
for(NSString *str in arr)//*str又称迭代变量,执行原理是将数组中的每一个元素赋值给迭代变量,再执行循环体
    NSLog(@"%@",*str);
//如果数组当中的元素的类型不一致,那么使用id进行遍历for(id item in arr)
//第三种方式:使用block方法
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj,NSUInteger idx,BOOL *stop){
    NSLog(@"%d %@",idx,obj);
    if(idx==)
        *stop = YES;
}];//中间的block部分是默认生产的,obj就是代表数组中的每一个元素,我们要做的事情就是把要遍历数组中元素的操作的代码部分写上就好;idx代表是每一个obj元素的下标;如果我们要终止循环,那么就将stop改为YES即可。
           

4). 字符串与数组

NSArray *arr = @[@"jack",@"jim",@"rose"];
NSString *str = [arr componentsJoinedByString:@"#"];//str内容是jack#jim#rose,参数是连接符
NSString *str = @"陕西西安,雁塔区,太白南路,西安电子科技大学";
NSArray *res = [str componentsSeperatedByString:@","];//此时数组中内容是@"陕西西安",@"雁塔区",@"太白南路",@"西安电子科技大学"
           

5). 数据的持久化

将数组中的内容永久保存(写到磁盘中)
[arr writetoFile:@"/Users/warwick/Desktop/abc.plist" atomically:NO];//将数组保存到abc.plist文件之中,.plist文件是属性列表文件

//读文件
NSArray *arr = [NSArray arrayWithContentsOfFile:@"/Users/warwick/Desktop/abc.plist"]
           

——–NSMutableArray——–

NSMutableArray是NSArray的子类,可以动态的新增和删除其数组中的元素,其他的用法均与NSArray一致。因此这里只讨论与父类不同的用法。

1). 创建方法

NSMutableArray *arr1 = [NSMutableArray new];
NSMutableArray *arr2 = [[NSMutableArray alloc] init];
NSMutableArray *arr3 = [NSMutableArray array];
//注意与NSArray不同,以上3种创建方式是有意义的,原因在于其元素可变!我们可以动态新增与删除元素。
NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"jack",@"rose",@"lili",nil];
NSMutableArray *arr5 = @[@"jack",@"rose",@"lili"];//error,因为右值是NSArray对象,arr5是一个子类指针,子类指针指向父类对象当调用自己特有的方法的时候会出问题!
           

2). 元素插入与删除

[arr1 addObject:@"jack"];//数组中有1个元素
NSArray *arr = @[@"rose",@"pony",@"lucy"];
[arr1 addObject:arr];//数组有2个元素,第一个元素是jack,第二个元素是arr数组!
[arr1 addObjectsFromArray:arr];//数组有5个元素,这是将另外一个数组中每一个元素添加到可变数组中的方法

//在指定的下标处插入元素
[arr1 insertObject:@"lilei", atIndex:];
//删除指定下标元素
[arr1 removeObjectAtIndex:];
[arr1 removeObject:@"jack"];//删除全部的jack
[arr1 removeObject:@"lucy" inRange:NSMakeRange(,)];//删除在下标0-3范围内的lucy
[arr1 removeAllObjects];//删除全部元素
           

——–NSNumber———

解决基本数据类型数据存储的问题。原理是将基本数据类型包装为NSNumber对象,再将NSNumber对象存储到NSArray数组当中。

NSNumber *number1 = [NSNumber numberWithInt:];
NSNumber *number2 = [NSNumber numberWithBool:];
NSNumber *number3 = [NSNumber numberWithDouble:];
NSNumber *number4 = [NSNumber numberWithChar:'a'];

NSArray *arr = @[number1,number2,number3,number4];
for(NSNumber *num in arr)
{
    //对每个元素的操作
}

//简写操作
NSArray *arr = @[@,@,@,@];//将包装有10,20,30,40的NSNumber对象放入到NSArray中