Ios NSArray containsObject:更快的替代方案?

Ios NSArray containsObject:更快的替代方案?,ios,objective-c,nsarray,Ios,Objective C,Nsarray,我用Instruments在我的iOS应用程序上运行了几次,我发现启动时主线程上90%的负载(总共约1000毫秒)是由containsObject:calls引起的。这是主线,我不认为这很酷 有没有比这种方法更快的替代方法?一种算法还是另一种方法 有什么建议吗 更多信息: 我再次查看了我的代码,我意识到事实上我不需要知道对象的顺序,只要对象是该集合的一部分。这意味着NSSet会做得很好(我想会更快) 对象数量-该集合中可能有1000多个对象 如果需要使用数组,请往下跳一点 备选方案 您的其他选

我用Instruments在我的iOS应用程序上运行了几次,我发现启动时主线程上90%的负载(总共约1000毫秒)是由containsObject:calls引起的。这是主线,我不认为这很酷

有没有比这种方法更快的替代方法?一种算法还是另一种方法

有什么建议吗

更多信息:

  • 我再次查看了我的代码,我意识到事实上我不需要知道对象的顺序,只要对象是该集合的一部分。这意味着NSSet会做得很好(我想会更快)

  • 对象数量-该集合中可能有1000多个对象


  • 如果需要使用数组,请往下跳一点


    备选方案 您的其他选择可能包括:

    • 使用一个
      NSDictionary
      ,它使用键->值对(我预计)具有O(1)读取复杂性,但代价是为键提供额外的存储空间

    • 如果您不使用副本,并且顺序也不重要,那么使用
      NSSet
      将提供更好的阅读复杂性(我不知道复杂性是什么,文档可能会)


    使用数组 如果您保持数组排序,则可以在
    O(logn)
    时间内完成搜索,而不是
    O(n)
    ,因为您可以利用二进制搜索

    警告选择器:这是从内存中写入的

    -(void)/*添加*/
    {
    int proposedIndex=0;
    proposedIndex=[array indexOfObject:节点
    inSortedRange:NSMakeRange(0,array.count)
    选项:NSBinarySearchingInsertionIndex
    使用比较器:
    ^N比较结果(id obj1,id obj2)
    {
    如果(obj1.valueToCompareobj2.valueToCompare)返回降级;
    否则返回DeredName;
    }];
    [数组插入对象:节点索引:proposedIndex];
    }
    -(id)/*获得*/
    {
    int location=[array indexOfObject:node
    inSortedRange:NSMakeRange(0,array.count)
    选项:NSBinarySearchingFirstEqual
    使用比较器:
    ^N比较结果(id obj1,id obj2)
    {
    如果(obj1.valueToCompareobj2.valueToCompare)返回降级;
    否则返回DeredName;
    }];
    if(location==NSNotFound)返回nil;
    返回[array objectAtIndex:location];
    }
    
    您可以使用
    NSSet containsObject
    NSArray
    更快
    NSSet
    对于这类事情不是更好地优化了吗?你可能想开发你自己的
    hash
    方法(和
    equals:
    ,因为他们是一对。我会研究一下!作为旁注,数组有多大?我没有意识到,但是
    containsObject
    的文档说它将检查数组的所有成员,这听起来有点令人困惑,所以我希望文档是错误的。@NikolayDyankov请记住,集合还需要不同的(非重复的)值。这是真的吗?是的,它们肯定都是独一无二的。这些对象是从核心数据中提取的,只有在提取的数组/集合中不存在这样的对象时,才会插入新的对象。这种检查在启动时会做很多次,因此通过发出请求来检查对象是否存在于核心数据中不是一个选项。最初我认为NSSet在搜索对象时比NSArray有更好的性能,但是即使NSSet迭代所有对象并检查它是否存在,这与NSArray相同。摘自NSSet文档-检查集合中的每个元素是否与某个对象相等,直到找到匹配项或到达集合的末尾。如果isEqual:返回YES,则认为对象相等。
    -(void) /*adding*/
    {
        int proposedIndex = 0;
        proposedIndex = [array indexOfObject:node
                                    inSortedRange:NSMakeRange(0, array.count)
                                          options:NSBinarySearchingInsertionIndex
                                  usingComparator:
                          ^ NSComparisonResult(id obj1, id obj2)
                          {
                              if (obj1.valueToCompare < obj2.valueToCompare) return NSOrderedAscending;
                              if (obj1.valueToCompare > obj2.valueToCompare) return NSOrderedDescending;
                              else return NSOrderedSame;
                          }];
    
        [array insertObject:node atIndex:proposedIndex];
    }
    
    
    -(id) /* Getting */
    {
        int location = [array indexOfObject:node
                                        inSortedRange:NSMakeRange(0, array.count)
                                              options:NSBinarySearchingFirstEqual
                                      usingComparator:
                              ^ NSComparisonResult(id obj1, id obj2)
                              {
                                  if (obj1.valueToCompare < obj2.valueToCompare) return NSOrderedAscending;
                                  if (obj1.valueToCompare > obj2.valueToCompare) return NSOrderedDescending;
                                  else return NSOrderedSame;
                              }];
        if (location == NSNotFound) return nil;
        return [array objectAtIndex:location];
    }