在Objective C开发中,应该会用到NSMutableArray,暂时理解为一个可变长度的数组吧。
这个东东提供了addObject方法,也提供了removeObject方法。问题描述:
在程序设计时,我将一组对象的指针add到了array中,现在array拥有了这些对象的所有权。现在我用removeObject删除某一项,根据removeObject的接口设计,没有返回值,因此我不知道在array中是否有这一项,也不知道是否删除成功了。再这种前提下,更可怕的事情发生了,当前要删除的这一项的对象所有权我怎么确定呢?我既不知道他是否再数组里,也不知道他是否已经被删除。问题:
有什么方法能再次确定所有权归属,既在做完删除操作以后是否能确定remove操作肯定成功了。我想了几种解决方案:一个是不用removeObject方法,直接用for循环查询数组内容比较要删除项,得到index值用removeObjectAtIndex删除。这样所有权归调用方,release掉合情合理。但是这个方法很难看。(NSMutableArray没有提供查询方法,只能for循环,这个可以理解因为不能保证数组有序,也就没有比for更快的查询方法了)第二个方案,还是用removeObject方法,在调用前后比较array数组大小,看看是否有变化,少了一个说明删除成功了,这个方法很二,不是线程安全的。但是代码比第一种方法简洁。不知道是不是我用错了,有经验的朋友有没有更好的解决方法。谢谢。

解决方案 »

  1.   

    removeObject 肯定会成功的,除非index超出范围了。
      

  2.   

    哦,我没说清楚,removeObject的参数可能不是数组中的项。又想到一个解决方法:-(void) removeCard: (AddressCard *) card
    {
    NSLog(@"AddressBook removeCard!!");

    NSUInteger index = [addressArray indexOfObject: card];
    if (index != NSNotFound) {
    id temp = [addressArray objectAtIndex: index];
    [addressArray removeObjectAtIndex: index];

    [temp release];
    }
    }
    这个我觉得靠谱一些。
      

  3.   

    上面代码有问题,数组中的obj被删除时会自动发送一个release消息,你再[temp releas],会导致内存错误
      

  4.   

    经过测试,我觉得LS说得不对,如果不调用temp release程序不会调用我重载的dealloc函数(我在其中打了log的确没有调用),也就是说会出现野指针。
      

  5.   

    活活,还真是哦,Array remove的时候引用计数会减一个,但是应该对应add的时候还加了一个呢~~这样也是平衡的呀~~
      

  6.   

    只是点个人建议。感觉楼主也是从其它开发语言转入Object-C,所以习惯性地会要先确认老数据存在才进行删除。我是觉得Object-C的消息机制自动忽略失败,所以不需要再去关心删除失败的问题。也就是说,从数组中找出元素并删除,都丢给NSMutableArray的实现去做。虽然确实把内部处理操作异常的功能也丢了。不过苹果收钱那么黑,如果NSMutableArray没把该删除的数据删掉的话,到时是不是也可以收点赔偿费呢?
      

  7.   

    真被楼上说对了,我还真是从别的语言开发过来的。我的习惯把底层弄明白⋯⋯不知道有没有深入讲解cocoa和objective-c的书?