與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