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<ObjectType> *)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

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

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容