NSArray数组类:
不可变,对象的有序集合(对象可为不同类型) ,存储对象的地址(引用) ,通过下标访问,下标从0开始
方法:
@[@"",@"",@""];
arrayWithObjects: 初始化并赋值
arrayWithArray 通过一个数组,来创建一个数组
initWithObjects: 初始化并赋值
initWithArray 通过一个数组,来创建一个数组
简化写法:传入值不能为nil
SArray *array;
array = @[]; //空数组
array = @[ a ]; //一个对象的数组
array = @[ a, b, c ]; //多个对象的数组
NSMutableArray *mutablePlanets = [@[@"Mercury", @"Venus", @"Earth",@"Mars", @"Jupiter", @"Saturn",@"Uranus", @"Neptune"] mutableCopy];
//访问:
objectAtIndex:X 数组下标为X的值 array[2]
indexOfObject:@"X" 返回X第一次出现的位置
lastObject
firstObject
isEquaToArray
firstObjectCommonWithArray 返回第一个共同值
count 数组的元素个数
containsObject:
componentsJoinedByString 整合为字符串
NSMutableArray
exchangeObjectAtIndex:0 withObjectAtIndex:1交换值
arrayWithCapacity:10
initWithCapacity:10 //预设容量为10
initWithObjects:
arrayWithObjects
arrayByAddingObject 添加元素
arrayByAddingObjectsFromArray
addObject: 添加到数组
addObjectsFromArray
insertObject
setArray: 用新的数组替换原来的数组
removeObject: 从数组中移除
removeAllObjects 移除所有的元素
removeLastObject
removeObjectAtIndex:i 移除下标为i的元素
subarrayWithRange 获取元素
compontsSeparateByString 分割
replaceObjectAtIndex
exchangeObjectAtIndex
//遍历数组
NSArray *array = @[@"I",@"Love",@"China"];
//方法一:数组下标遍历
NSInteger conArray = [array count];
for (int i = 0; i<conArray; i++) {
NSLog(@"%@",[array objectAtIndex:i]);
}
//方法二:枚举器
//倒序枚举
NSEnumerator *revEnum = [array reverseObjectEnumerator ];
id obj = nil;
while (obj = [revEnum nextObject]) {
NSLog(@"%@",obj);
}
//正序枚举
NSEnumerator *enumetator = [array objectEnumerator];
id obj1 = nil;
while (obj1 = [enumetator nextObject]) {
NSLog(@"obj1=%@",obj1);
}
//方法三:
for (id obj3 in array) {
NSLog(@"obj3=%@",obj3);
}
//方法4 枚举 和 block
//正序枚举
[array enumeratorObjectsUsingBlock:
^(id obj, NSUInteger index, BOOL *stop){
NSLog(@"%i-%@",index,obj);
//若终断循环
*stop = YES;
}];
//倒序枚举
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger index, BOOL *stop){
NSLog(@"%@",arr2[index]);
}];
//方法5 dispatch_apply
dispatch_queue_t queue =dispatch_queue_create("apply并行队列", DISPATCH_QUEUE_CONCURRENT);
dispatch_apply([array count], queue, ^(size_t index) {
NSLog(@"%@----%@",array[index],[NSThread currentThread]);
});
}
//链接:https://www.jianshu.com/p/d115c86ff128
总结:
NSArray creates static arrays, and NSMutableArray creates dynamic arrays.
注意:
数组里面存放对象,非对象 bool integer 等需要NSNumber转换。
数组去重:
遍历是普遍方法,也可以利用字典key唯一的特性:
碰到重复key时,不会再创建一个键值对而是给上一个key的键值对再重新赋值
为什么NSArray不可变 ? 那为什么又可以重新赋值?如下:
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
arr = @[@"4",@"5",@"6",@"8"];
这样做是开辟了新的内存并把数组重新指向了它,并非改变了原来的对象。
试着改变 arr[0] = @""; 这样做是错误的。
为什么NSMutableArray用strong ,NSArray用copy ?
https://blog.csdn.net/winzlee/article/details/51752354
NSMutableArray用copy为关键字的话,调用setter方法后。是对赋值对象进行深拷贝。并且拷贝的对象是copy的(不可变的),而不是mutableCopy的(可变的)。所以用copy修饰的mutableArray也被视为Array了,所以再用mutableArray的方法就会发生崩溃。
NSArray被strong修饰之后,由于只是强引用,所以副本对象数组和源对象数组只是指向同一个内存区域,这样就会造成副本对象数组会随着源对象数组的改变而改变,即便有时候你并不想让副本对象跟着改变。
一个属性标记了copy,当你调用他的setter方法,他会建立一个索引计数为1的对象,然后释放旧对象。
当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。
网友评论