NSMutableArray简单细说(四)—— 数组元素的删除

版本记录

版本号 时间
V1.0 2017.08.26

前言

NSArray是数组的不变数组类,不边数组在初始化的时候元素就是不变的,不能更改任何一个元素,实际上我们用的较多的是可变数组,因为很多时候我们都需要对数组元素进行增删改查,其中增删改也只有可变数组可以做,也就是说可变数组相对来说更加灵活,这几篇我们就说一下可变数组的这个类及其相关知识,还是老规矩从整体到局部,从浅入深进行讲解,谢谢大家。感兴趣的可以看我写的上面几篇。
1. NSMutableArray简单细说(一)—— 整体了解
2. NSMutableArray简单细说(二)—— 创建和初始化
3. NSMutableArray简单细说(三)—— 数组元素的增加

一、- (void)removeAllObjects;

该方法的作用是:删除数组中所有元素,清除数组。

下面看简单代码

- (void)demoRemoveAllObjects
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    [arrM removeAllObjects];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

下面看输出结果

2017-08-26 20:55:49.443 JJOC[12659:333376] arrM = (
), count = 0

结论:清空数组,很常用。


二、- (void)removeLastObject;

该方法的作用:移除最后一个元素,也就是索引值最大的元素。

下面看一下代码

- (void)demoRemoveLastObject
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    [arrM removeLastObject];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

看输出结果

2017-08-26 21:00:38.194 JJOC[12823:337559] arrM = (
    1,
    2,
    3
), count = 3

结论:移除最后一个元素。


三、- (void)removeObject:(ObjectType)anObject;

该方法的作用就是:删除给定对象的数组中的所有事件。

该方法通过使用isEqual:方法将anObject与接收器中的对象进行比较来确定匹配。 如果数组不包含一个对象,该方法没有任何效果(尽管它确实会引起搜索内容的开销)。

下面看简单代码

- (void)demoRemoveObject
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    [arrM removeObject:@1];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

下面看输出结果

2017-08-26 21:07:28.943 JJOC[13062:344071] arrM = (
    2,
    3,
    4
), count = 3

结论:移除数组中某一个对象,可能对象不存在,返回nil。


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

该方法的作用就是:移除数组中给定区间的元素。

这里还要注意:

  • 如果aRrange超出数组的边界,则引发异常NSRangeException
  • 通过使用isEqual:方法将anObject与接收器中的对象进行比较来确定匹配。 如果数组不包含aRange中的一个对象,该方法没有任何效果(尽管它确实会引起搜索内容的开销)。

下面看示例代码

- (void)demoRemoveObjectRange
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    [arrM removeObject:@2 inRange:NSMakeRange(0, 2)];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

下面看输出结果

2017-08-26 21:14:41.525 JJOC[13272:350203] arrM = (
    1,
    3,
    4
), count = 3

结论:移除某一区间的对象,可能该区间没有这个元素。


五、- (void)removeObjectAtIndex:(NSUInteger)index;

该方法的作用是:移除某一索引的元素。

下面看一下参数:

  • index:从中删除数组中的对象的索引。 该值不能超过数组的边界。如果索引超出数组的末尾,则引发异常NSRangeException

还要注意:

  • 为了弥补差距,除索引之外的所有元素都通过从其索引中减去1来移动。

下面看示例代码:

- (void)demoRemoveObjectAtIndex
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    [arrM removeObjectAtIndex:0];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

下面看输出结果

2017-08-26 21:19:12.196 JJOC[13482:355754] arrM = (
    2,
    3,
    4
), count = 3

结论:移除某一索引的对象。


六、- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;

该方法的作用是:从给定数组中一次移除多个索引处的对象。

下面看一下参数:

  • indexes:要从数组中删除的对象的索引。 由索引指定的位置必须位于数组的边界内。

下面还要注意:

  • 此方法与removeObjectAtIndex:类似,但允许您通过单个操作有效地删除多个对象。 索引指定在调用方法时给定数组状态的要删除的对象的位置,如以下示例所示:
- (void)demoRemoveObjectsAtIndexes
{
    NSMutableArray *array = [NSMutableArray arrayWithObjects: @"one", @"a", @"two", @"b", @"three", @"four", nil];
    NSMutableIndexSet *indexes = [NSMutableIndexSet indexSetWithIndex:1];
    [indexes addIndex:3];
    [array removeObjectsAtIndexes:indexes];
    NSLog(@"array: %@", array);
}

看输出结果

2017-08-26 21:24:40.749 JJOC[13683:361762] array: (
    one,
    two,
    three,
    four
)

结论:一批次删除不同索引多处元素。


七、- (void)removeObjectIdenticalTo:(ObjectType)anObject;

该方法的作用是:删除数组中给定对象的所有出现。

还要注意:

  • 该方法通过将aObject的地址与接收器中的对象的地址进行比较来确定匹配。 如果数组不包含一个对象,该方法没有任何效果(尽管它确实会引起搜索内容的开销)。

下面看示例代码

- (void)demoRemoveObjectIdenticalTo
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    [arrM removeObjectIdenticalTo:@4];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

看输出结果

2017-08-26 21:34:22.534 JJOC[13903:368617] arrM = (
    1,
    2,
    3
), count = 3

结论:移除与数组中相同地址的元素。


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

该方法的作用:删除给定区间所有的元素。

这里要注意:

  • range参数越界会抛出NSRangeException错误。
  • 该方法通过将aObject的地址与接收器中的对象的地址进行比较来确定匹配。 如果数组不包含aRange中的一个对象,该方法没有任何效果(尽管它确实会引起搜索内容的开销)。

下面看代码

- (void)demoRemoveObjectIdenticalToRange
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    [arrM removeObjectIdenticalTo:@3 inRange:NSMakeRange(0, 3)];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

看输出结果

2017-08-26 21:41:03.361 JJOC[14154:375776] arrM = (
    1,
    2,
    4
), count = 3

结论:删除给定区间相同地址的元素。


九、- (void)removeObjectsFromIndices:(NSUInteger *)indices numIndices:(NSUInteger)cnt;

该方法的作用是:从指定的索引开始,从数组中移除指定数量的对象。

下面看一下参数:

  • indices:要从接收数组中删除的对象的索引的C数组。
  • cnt:要从接收数组中删除的对象数。

这里还要注意:

  • 此方法与removeObjectAtIndex:类似,但它允许您通过单个操作有效地删除多个对象。 如果按升序对索引列表进行排序,则可以提高此操作的速度。此方法无法发送到具有分布式对象的远程对象。
  • 这种不推荐使用的方法使用C数组的索引。 removeObjectsAtIndexes:方法使用NSIndexSet,它提供了一种更有效的索引到数组的方式。

结论:删除指定位置指定数目的元素。


十、- (void)removeObjectsInArray:(NSArray *)otherArray;

该方法的作用是:从接收数组中删除另一给定数组中的对象。

此方法与removeObject类似,但它允许您通过单个操作有效地删除大量对象。 如果接收数组不包含otherArray中的对象,则该方法不起作用(尽管它确实会引起搜索内容的开销)。此方法假定otherArray中的所有元素都响应hashisEqual :

下面看示例代码

- (void)demoRemoveObjectsInArray
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    NSArray *anotherArr = @[@1, @3];
    [arrM removeObjectsInArray:anotherArr];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

下面看输出结果

2017-08-26 22:01:46.125 JJOC[15485:402788] arrM = (
    2,
    4
), count = 2

结论:纯粹的大批量操作,从数组中删除给定数组中相同的元素。


十一、- (void)removeObjectsInRange:(NSRange)range;

该方法的作用就是:从数组给定区间内删除对象元素。

看一个简单示例

- (void)demoRemoveObjectsInRange
{
    NSArray *givenArr = @[@1, @2, @3, @4];
    NSMutableArray *arrM = [NSMutableArray array];
    [arrM addObjectsFromArray:givenArr];
    [arrM removeObjectsInRange:NSMakeRange(0, 3)];
    NSLog(@"arrM = %@, count = %ld", arrM, arrM.count);
}

看输出结果

2017-08-26 22:08:40.512 JJOC[15766:409860] arrM = (
    4
), count = 1

结论:删除给定区间内的元素对象。

后记

未完,待续~~~

NSMutableArray简单细说(四)—— 数组元素的删除_第1张图片

你可能感兴趣的:(NSMutableArray简单细说(四)—— 数组元素的删除)