OC--NSMutableArray可变数组

NSMutableArray继承自NSArray,所以,在上一篇文章中提到的属性和方法,在这里是适用的,但是也有不同的地方,既然是可变的,可动态分配的,那么他的创建就和NSMutableString一样先要去申请内存。所以NSMutableArray的创建和初始化就应该和NSMutableString的形式相同了。而不能够适用NSArray的简化形式。

说NSMutableArray之前我们先来看一段代码:

NSArray *arr = @[@"aaa"@"bbb"];

        NSLog(@"%p", &arr);//数组的地址

        NSLog(@"%@", arr);//数组

        

        arr = [arr arrayByAddingObject:@"ddd"];//数组添加操作

        NSLog(@"%p", &arr);//数组地址

        NSLog(@"%@", arr);//数组

打印结果:

2017-03-20 15:26:28.392 OCdemo[1259:152466] 0x7fff5fbff7e0

2017-03-20 15:26:28.393 OCdemo[1259:152466] (

    aaa,

    bbb

)

2017-03-20 15:26:28.393 OCdemo[1259:152466] 0x7fff5fbff7e0

2017-03-20 15:26:28.393 OCdemo[1259:152466] (

    aaa,

    bbb,

    ddd

)

Program ended with exit code: 0

通过打印结果会发现数组在添加后的地址是不变的,这样是不是上一篇文章中说的在数组操作的时候,其实是有一个新的数组产生了这个说话就错了?当然不是得,这里打印的地址是数组第一个元素的地址,也就是arr[1]的地址,在给数组添加元素的时候,数组的第一个元素并没有改变,所以这里打印的地址也就不会变还是只想数组第一个元素@“aaa”的指针。


1、可变数组创建。

可变数组的创建,其实就是向内存去申请空间的操作:

+ (instancetype)arrayWithCapacity:(NSUInteger)numItems;

这个方法就是创建一个可变数组对象的类方法, numItems表示要申请的数组的长度。

例如:

NSMutableArray *array = [NSMutableArray arrayWithCapacity:20];

就是创建了一个名为array的可变数组,并且数组长度为20

当然还有一种情况存在,那就是在我创建一个可变数组的时候,我并不知道我要申请多少的空间,这个时候动态就体现了出来,只需要将numItems的值设置为0,即可在初始化的时候动态分配空间。

创建一个数组的init方法

- (instancetype)init NS_DESIGNATED_INITIALIZER;

创建一个可变数组,并设置数组长度

- (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER;

创建一个可变数组,并将反归档数据分配给这个数组。以后在数据持久化存储里详细说明

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;



2、可变数组操作方法

给数组中添加元素:

给数组中添加一个元素,这中添加是在数组的最后添加一个元素

- (void)addObject:(ObjectType)anObject;

在指定的下标位置,给数组中添加一个元素

- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;

代码示例:

        NSArray *arr = @[@"aaa"@"bbb"];

        //创建数组

        NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];

        //初始化赋值

        array = [NSMutableArray arrayWithArray:arr];

        NSLog(@"原始数组:%@", array);

        //数组中添加元素

        //在最后添加一个元素

        [array addObject:@"aaa"];

        NSLog(@"在数组最后添加一个元素后的数组数组:%@", array);

        //在指定位置添加元素,在下标为2的位置添加一个@“ccc”

        [array insertObject:@"ccc" atIndex:2];

        NSLog(@"在下标为2的位置添加一个@“ccc”后的数组数组:%@", array);

打印结果:

2017-03-20 15:57:40.345 OCdemo[1381:166297] 原始数组:(

    aaa,

    bbb

)

2017-03-20 15:57:40.346 OCdemo[1381:166297] 在数组最后添加一个元素后的数组数组:(

    aaa,

    bbb,

    aaa

)

2017-03-20 15:57:40.346 OCdemo[1381:166297] 在下标为2的位置添加一个@“ccc”后的数组数组:(

    aaa,

    bbb,

    ccc,

    aaa

)

Program ended with exit code: 0



删除数组的最后一个元素

- (void)removeLastObject;

删除数组中指定下标的元素

- (void)removeObjectAtIndex:(NSUInteger)index;

删除数组中所有的元素

- (void)removeAllObjects;

删除数组中的一个元素,根据对象删除

- (void)removeObject:(ObjectType)anObject;

代码示例:

        NSArray *arr = @[@"aaa"@"bbb"@"ccc"@"ddd"];

        //创建数组

        NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];

        //初始化赋值

        array = [NSMutableArray arrayWithArray:arr];

        NSLog(@"原始数组:%@", array);

        //删除数组中的元素

        [array removeObjectAtIndex:2];

        NSLog(@"删除下标为2的元素后的数组:%@", array);

        //删除为@“aaa”的元素

        [array removeObject:@"aaa"];

        NSLog(@"删除@“aaa”后的数组:%@", array);

        //删除所有元素

        [array removeAllObjects];

        NSLog(@"删除所有元素后的数组:%@", array);

打印结果:

2017-03-20 16:03:25.553 OCdemo[1432:169066] 原始数组:(

    aaa,

    bbb,

    ccc,

    ddd

)

2017-03-20 16:03:25.554 OCdemo[1432:169066] 删除下标为2的元素后的数组:(

    aaa,

    bbb,

    ddd

)

2017-03-20 16:03:25.554 OCdemo[1432:169066] 删除@“aaa”后的数组:(

    bbb,

    ddd

)

2017-03-20 16:03:25.554 OCdemo[1432:169066] 删除所有元素后的数组:(

)

Program ended with exit code: 0


删除数组中的一个元素,根据地址删除

- (void)removeObjectIdenticalTo:(ObjectType)anObject;

删除数组中的元素,根据地址和范围删除,这个范围是在数组中有相同元素的时候使用。

- (void)removeObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range;


当数组中有两个相同元素时,删除其中一个元素,其中range的length属性就无用了,在数组不越界的情况下是1。当出现连续相同元素的时候,这个length属性才开始起作用

- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;

代码示例:

        NSArray *arr = @[@"aaa"@"bbb"@"aaa"@"aaa"@"aaa"];

        //创建数组

        NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];

        //初始化赋值

        array = [NSMutableArray arrayWithArray:arr];

        NSLog(@"原始数组:%@", array);

        //根据下标删除指定位置的数组

        //观察上面的数组,其中@“aaa”这个元素出现了4次,这个时候,我想要删除中间的两个@“aaa”要是单单使用removeObjectAtIndex:方法或者removeObject:方法显然都不是很合适。这个时候,另一个方法就很好

        //这里,从下标为2的元素开始,删除@“aaa”,删除元素的个数为2.

        [array removeObject:@"aaa" inRange:NSMakeRange(2, 2)];

        NSLog(@"第一次删除删除后的数组:%@", array);

        /*

         现在要删除@“bbb”这个元素,因为在数组中国只有一个,我们使用简单的removeObjectAtIndex:方法或者removeObject:方法即可。如果使用removeObject: inRange:方法,这时候rangelength就不会再起作用

         */

        [array removeObject:@"bbb" inRange:NSMakeRange(1, 2)];


        NSLog(@"第二次删除后的数组:%@", array);

打印结果:

2017-03-20 16:16:04.334 OCdemo[1475:173929] 原始数组:(

    aaa,

    bbb,

    aaa,

    aaa,

    aaa

)

2017-03-20 16:16:04.335 OCdemo[1475:173929] 第一次删除删除后的数组:(

    aaa,

    bbb,

    aaa

)

2017-03-20 16:16:04.335 OCdemo[1475:173929] 第二次删除后的数组:(

    aaa,

    aaa

)

Program ended with exit code: 0

从上面的代码可以出当删除@“bbb”元素的时候,range写的是(1, 3),这样还是只删除了一个@“bbb”元素。是因为数组中只有一个这样的元素,所以就只能删除一个。


替换数字中指定下标的元素

- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;

使用另一个数组中的指定范围的子数组替换数组中置顶范围的子数组,这个方法其实就是对上面方法的批量操作

- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray range:(NSRange)otherRange;

使用另一个数组替换数组中置顶范围的子数组,这个方法其实也是对第一个单个元素替换方法的批量操作

- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray;

给数组的后面添加一个数组,可作为两个数组合并的方法使用

- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;

交换数组中两个元素,idx1、idx2表示要交换位置的元素的下标

- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;

代码示例:

NSArray *arr = @[@"aaa"@"bbb"@"aaa"@"aaa"@"aaa"];

        NSArray *arr1 = @[@"ddd"@"ooo"];

        //创建数组

        NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];

        //初始化赋值

        array = [NSMutableArray arrayWithArray:arr];

        NSLog(@"原始数组:%@", array);

        //替换下标为2的元素,替换为@“ccc”

        [array replaceObjectAtIndex:2 withObject:@"ccc"];

        NSLog(@"替换后的数组:%@", array);

        //array后面拼接上数组arr1

        [array addObjectsFromArray:arr1];

        NSLog(@"拼接后的数组:%@", array);

        //将数组中下标为1的元素和下标为2的元素交换

        [array exchangeObjectAtIndex:1 withObjectAtIndex:2];

        NSLog(@"交换后的数组:%@", array);

打印结果:

2017-03-20 16:38:05.002 OCdemo[1497:180929] 原始数组:(

    aaa,

    bbb,

    aaa,

    aaa,

    aaa

)

2017-03-20 16:38:05.003 OCdemo[1497:180929] 替换后的数组:(

    aaa,

    bbb,

    ccc,

    aaa,

    aaa

)

2017-03-20 16:38:05.003 OCdemo[1497:180929] 拼接后的数组:(

    aaa,

    bbb,

    ccc,

    aaa,

    aaa,

    ddd,

    ooo

)

2017-03-20 16:38:05.003 OCdemo[1497:180929] 交换后的数组:(

    aaa,

    ccc,

    bbb,

    aaa,

    aaa,

    ddd,

    ooo

)

Program ended with exit code: 0



可变数组的遍历和NSArray的方法相同,这里就不说了。到这里,可变数组(NSMutableArray)的操作就已经说完了,在开发中,所用到的也大多是这些东西。

猜你喜欢

转载自blog.csdn.net/m0_37681833/article/details/64128292
今日推荐