现在的位置: 首页 > 综合 > 正文

PSA: 从数组移除对象

2013年12月13日 ⁄ 综合 ⁄ 共 892字 ⁄ 字号 评论关闭
PSA: Removing objects from arrays

  1. 你创建一个NSMutableArray.
  2. 两次添加相同一个对象到数组中
  3. 向数组发送removeObjectIdenticalTo: 消息, 传入你所添加的对象

数组的count是多少?

如果你说1, 你就错了(you’re wrong).

更糟的是,你可能会认为和addObject相反是removeObject:(尤其是如果你从来没有听说过... IdenticalTo:的版本),但那更错了:removeObject:通过测试相等(向它们发送isEqual:消息)找到对象(们),删除,而不是简单地寻找你传入的对象。这意味着它可能会删除不是你传入的对象,但它都是相同的。所以,除非你真的要删除你拥有的任何一个相同的对象,你应该更喜欢removeObjectIdenticalTo:。

但是,仍然完全从数组删除对象,无论它存在几个。除非你真的想,你更??有可能想要这个:

NSUInteger IDX = myArray的indexOfObjectIdenticalTo:OBJ];
[myArray的removeObjectAtIndex:IDX];

即使是这样,将删除从您添加的首个对象而不是最后一个,所以如果你特别需要删除最后的那个,你把它添加(后进先出法,而不是先进先出),然后你需要倒序遍历枚举(enumerate
the array backwards
),计算的索引,通过索引中删除找到的对象后,最终跳出循环。

为了让这个简单和避免很可能在许多独立的实现中的一次次的解决错误,这里的一个类别(a category you can add to your projects),您可以添加到您的项目。在任何地方你需要?? - [NSMutableArray addObject:]的相反操作的地方使用。

但这对于set不要紧,因为它在相等的基础上欺骗的检查每一个对象。一个set,删除相等的对象和删除相同的对象,是同样的事情,这是为什么NSMutableSet没有removeObjectIdenticalTo。数组就不是这样的,这就是为什么NSMutableArray是这样的。

抱歉!评论已关闭.