版本记录
版本号 | 时间 |
---|---|
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中的所有元素都响应hash
和isEqual :
。
下面看示例代码
- (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
结论:删除给定区间内的元素对象。
后记
未完,待续~~~