Ios NSMutable对象:removeAllObjects与containsObject速度

Ios NSMutable对象:removeAllObjects与containsObject速度,ios,optimization,Ios,Optimization,免责声明:我对iOS开发比较陌生。我正在为这个项目使用ARC 我想知道哪些操作更快,为什么 if([selectedIndexes containsObject:indexPath]) { [selectedIndexes removeAllObjects]; for(int i=0; i<self.options.count; i++) { [selectedIndexes addObject:[NSIndexPath indexPathForItem:i

免责声明:我对iOS开发比较陌生。我正在为这个项目使用ARC

我想知道哪些操作更快,为什么

if([selectedIndexes containsObject:indexPath]) {
    [selectedIndexes removeAllObjects];
    for(int i=0; i<self.options.count; i++) {
        [selectedIndexes addObject:[NSIndexPath indexPathForItem:i inSection:0]];   
    }
} 
if([selectedIndexes containsObject:indexPath]){
[选定的索引删除所有对象];
对于(int i=0;i让我们分析一下(如果包装循环的
相同,那么我将忽略它):

选项1:
-removeAllObjects
:从数组中移除所有对象,每个对象释放一次==>N次操作,至少==>O(N)
循环进行N次迭代,每次迭代:
*创建一个
nsindepath
==>O(1)
*将索引路径添加到数组的末尾==>O(1)
==>O(N)+O(N)+N*O(1)+N*O(1)=2O(N)+2*N*O(1)=4O(N)=O(N)

选项2:
循环进行N次迭代,每次迭代:
*创建一个
nsindepath
==>O(1)
*验证数组中是否存在==>O(N)(数组必须假定它可能包含重复项)
*
if
语句也将有其代价,因为它将被询问N次,并将弄乱循环的分支谓词。
**循环中的添加是一个概率问题(暂时忽略它)
==>N*(O(1)+O(N)+O(1))=N*O(N)+2*N*O(1)=O(N^2)

==>平面分析表明第一种选择更好

如果要使用
NSMutableIndexSet
则两个选项的代码都是这样的:

//Not tested
//Assume that selectedIndexes is a NSMutableIndexSet
if ([selectedIndexes containsIndex:indexPath.row]) {
    if (self.options.count) {//This could probably be optimised depend on your goal
        [selectedIndexes addIndexesInRange:NSMakeRange(0,self.options.count-1)];
    } else {
        [selectedIndexes removeAllIndexes];
    }
} 
==>这里最糟糕的情况复杂度可能是O(N)


请随时更正任何错误的假设或计算

您不能直接使用吗?这真的是应用程序的时间关键部分吗?如果不是,我会让编译器生成合理的代码。您想做什么?您能解释一下self.options在代码中的作用吗?是否选择了索引
>数组或集合?以最清楚、最直接地表达您意图的方式编写代码。然后,如果探查器说速度太慢,请担心是否能找到更快的方法。
//Not tested
//Assume that selectedIndexes is a NSMutableIndexSet
if ([selectedIndexes containsIndex:indexPath.row]) {
    if (self.options.count) {//This could probably be optimised depend on your goal
        [selectedIndexes addIndexesInRange:NSMakeRange(0,self.options.count-1)];
    } else {
        [selectedIndexes removeAllIndexes];
    }
}