讨论个接口设计问题关于NSMutableArray的

iOS 码拜 6年前 (2015-05-09) 229次浏览 0个评论
 

在Objective C开发中,应该会用到NSMutableArray,暂时理解为一个可变长度的数组吧。
这个东东提供了addObject方法,也提供了removeObject方法。

问题描述:
在程序设计时,我将一组对象的指针add到了array中,现在array拥有了这些对象的所有权。

现在我用removeObject删除某一项,根据removeObject的接口设计,没有返回值,因此我不知道在array中是否有这一项,也不知道是否删除成功了。

再这种前提下,更可怕的事情发生了,当前要删除的这一项的对象所有权我怎么确定呢?我既不知道他是否再数组里,也不知道他是否已经被删除。

问题:
有什么方法能再次确定所有权归属,既在做完删除操作以后是否能确定remove操作肯定成功了。

我想了几种解决方案:

一个是不用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方法
引用 2 楼 biosli 的回复:

哦,我没说清楚,removeObject的参数可能不是数组中的项。

又想到一个解决方法:
C/C++ code

-(void) removeCard: (AddressCard *) card
{
    NSLog(@”AddressBook removeCard!!”);
    
    NSUInteger index = [addressArray indexOfObjec……

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

经过测试,我觉得LS说得不对,如果不调用temp release程序不会调用我重载的dealloc函数(我在其中打了log的确没有调用),也就是说会出现野指针。
活活,还真是哦,Array remove的时候引用计数会减一个,但是应该对应add的时候还加了一个呢~~这样也是平衡的呀~~
40分
只是点个人建议。

感觉楼主也是从其它开发语言转入Object-C,所以习惯性地会要先确认老数据存在才进行删除。

我是觉得Object-C的消息机制自动忽略失败,所以不需要再去关心删除失败的问题。

也就是说,从数组中找出元素并删除,都丢给NSMutableArray的实现去做。虽然确实把内部处理操作异常的功能也丢了。

不过苹果收钱那么黑,如果NSMutableArray没把该删除的数据删掉的话,到时是不是也可以收点赔偿费呢?

真被楼上说对了,我还真是从别的语言开发过来的。

我的习惯把底层弄明白??不知道有没有深入讲解cocoa和objective-c的书?

10分
引用 8 楼 czl21 的回复:

只是点个人建议。

感觉楼主也是从其它开发语言转入Object-C,所以习惯性地会要先确认老数据存在才进行删除。

我是觉得Object-C的消息机制自动忽略失败,所以不需要再去关心删除失败的问题。

也就是说,从数组中找出元素并删除,都丢给NSMutableArray的实现去做。虽然确实把内部处理操作异常的功能也丢了。

不过苹果收钱那么黑,如果NSMutableArray没把该……

学习,从其他语言转过来这个确实容易按照老的思维来想问题。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明讨论个接口设计问题关于NSMutableArray的
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!