与Swift的数组不同,Swift的数组直接用let, var来区分此数组是不是可以改变的。OC里的数组没那么简单实现。需要用到方法,如下:
可变方法一:
先定义_datas为可变的数组
@interface ViewController ()
{
NSMutableArray *_datas; //定义_datas为可变数组
}
@end
进行初始化
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_datas = [NSMutableArray array]; //初始化_datas
赋值
[_datas addObject:@"22"]; //直接给_datas赋值
NSLog(@"_datas = %@",_datas);
}
@end
方法二:
把一个array数组.mutablecopy, 变成可变数组
NSMutableArray *mutiArray = array. mutableCopy;
NSLog(@"mutiArray:%@",mutiArray);
[mutiArray addObject:@00]; //在最后面添加00
[mutiArray insertObject:@100 atIndex:0]; //在第0位添加100
NSLog(@"mutiArray:%@",mutiArray);
mutiArray[0] = @200; //第0位的值改为200
NSLog(@"mutiArray:%@",mutiArray);
[mutiArray removeObjectAtIndex:0]; //删除第0位的值
if([mutiArray containsObject:@200]){ //判断mutiArray里面有没有包含@200这个值,如果有就进入这个大括号里打印下面的字符串.
NSLog(@"contain @200");
}
用枚举方法可以实现遍历数组里的下标和对应的值.
而且在写代码的时候,只要写[array enum 再敲几个回车就会有写好的方法了,非常方便。
假设我们在第2位的时候停止,(只能写*stop。enum没有break这个方法。)
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if(idx == 2){
*stop = YES;
}
NSLog(@"%ld>>>>>%@",idx,obj);
}]
打印结果如下:
Paste_Image.png不可变数组:
不可变数组是不可以改变里面的值的,否则会挂
.copy后两个Array的地址相同,
NSArray *arr = @[@11,@22];
// NSMutableArray *mutiArray = (NSMutableArray*)arr;
NSMutableArray *mutiArray = arr.copy;
// [mutiArray addObject:@33]; 不可变数组不能直接赋值,否则直接挂。
NSLog(@"mutiArray:%@",mutiArray); //打印mutiArray的值
NSLog(@"%p",arr); //打印arr的地址
NSLog(@"%p",mutiArray); //打印mutiArray的地址
打印结果如下:
Paste_Image.png总结:
不管A,B是不是可变的数组对象。copy后都是不可变的。
不管A,B是不是可变的数组对象。mutablecopy后都是可变的。
如果A是不可变的数组,copy以后的对象B,和A是同一个地址。
NSArray *arr = @[@11,@22];
NSArray *arr2 = arr.copy;
NSLog(@"%p",arr);
NSLog(@"%p",arr2);
如果A本身是可变的数组,copy以后的对象B,和A不是同一个地址。
NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@11,@22, nil];
NSArray *arr4 = arr3.copy;
NSLog(@"%p",arr3);
NSLog(@"%p",arr4);
打印结果如下:
Paste_Image.png
网友评论