美文网首页
iOS-NSArray

iOS-NSArray

作者: 我是谁重要吗 | 来源:发表于2018-03-23 21:04 被阅读27次

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。

相关文章

  • iOS-NSArray

    NSArray数组类:不可变,对象的有序集合(对象可为不同类型) ,存储对象的地址(引用) ,通过下标访问,下标...

  • iOS-NSArray和 NSDictionary 初始化优劣对

    序言 NSArray和NSDictionary是我们平常开发经常用到的,但是如果使用不当,也会造成一些问题,这里详...

网友评论

      本文标题:iOS-NSArray

      本文链接:https://www.haomeiwen.com/subject/ircfcftx.html