在Objective C开发中,应该会用到NSMutableArray,暂时理解为一个可变长度的数组吧。 问题描述: 现在我用removeObject删除某一项,根据removeObject的接口设计,没有返回值,因此我不知道在array中是否有这一项,也不知道是否删除成功了。 再这种前提下,更可怕的事情发生了,当前要删除的这一项的对象所有权我怎么确定呢?我既不知道他是否再数组里,也不知道他是否已经被删除。 问题: 我想了几种解决方案: 一个是不用removeObject方法,直接用for循环查询数组内容比较要删除项,得到index值用removeObjectAtIndex删除。这样所有权归调用方,release掉合情合理。但是这个方法很难看。(NSMutableArray没有提供查询方法,只能for循环,这个可以理解因为不能保证数组有序,也就没有比for更快的查询方法了) 第二个方案,还是用removeObject方法,在调用前后比较array数组大小,看看是否有变化,少了一个说明删除成功了,这个方法很二,不是线程安全的。但是代码比第一种方法简洁。 不知道是不是我用错了,有经验的朋友有没有更好的解决方法。谢谢。 |
|
30分 |
removeObject 肯定会成功的,除非index超出范围了。
|
哦,我没说清楚,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]; } } 这个我觉得靠谱一些。 |
|
20分 |
NSMutableArray有indexOfObject方法
|
上面代码有问题,数组中的obj被删除时会自动发送一个release消息,你再[temp releas],会导致内存错误 |
|
经过测试,我觉得LS说得不对,如果不调用temp release程序不会调用我重载的dealloc函数(我在其中打了log的确没有调用),也就是说会出现野指针。
|
|
活活,还真是哦,Array remove的时候引用计数会减一个,但是应该对应add的时候还加了一个呢~~这样也是平衡的呀~~
|
|
40分 |
只是点个人建议。
感觉楼主也是从其它开发语言转入Object-C,所以习惯性地会要先确认老数据存在才进行删除。 我是觉得Object-C的消息机制自动忽略失败,所以不需要再去关心删除失败的问题。 也就是说,从数组中找出元素并删除,都丢给NSMutableArray的实现去做。虽然确实把内部处理操作异常的功能也丢了。 不过苹果收钱那么黑,如果NSMutableArray没把该删除的数据删掉的话,到时是不是也可以收点赔偿费呢? |
真被楼上说对了,我还真是从别的语言开发过来的。
我的习惯把底层弄明白??不知道有没有深入讲解cocoa和objective-c的书? |
|
10分 |
学习,从其他语言转过来这个确实容易按照老的思维来想问题。 |