- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在寻找迭代 NSArray 的标准习语。我的代码需要适用于 OS X 10.4+。
最佳答案
10.5+/iOS 的普遍首选代码。
for (id object in array) {
// do something with object
}
此构造用于枚举符合 NSFastEnumeration
的集合中的对象。协议(protocol)。这种方法具有速度优势,因为它将指向多个对象(通过单个方法调用获得)的指针存储在缓冲区中,并通过使用指针算法在缓冲区中前进来迭代它们。这比每次循环调用 -objectAtIndex:
快很多。
还值得注意的是,虽然您在技术上可以使用 for-in 循环来单步执行 NSEnumerator
,但我发现这几乎抵消了所有速度优势的快速枚举。原因是 -countByEnumeratingWithState:objects:count:
的默认 NSEnumerator
实现在每次调用时只在缓冲区中放置一个对象。
我在 radar://6296108
中报告了这一点(NSEnumerators 的快速枚举速度很慢),但它被返回为 Not To Be Fixed。原因是快速枚举会预取一组对象,如果您只想枚举到枚举器中的给定点(例如,直到找到特定对象或满足条件)并在中断后使用相同的枚举器在循环中,通常会跳过几个对象。
如果您正在为 OS X 10.6/iOS 4.0 及更高版本进行编码,您还可以选择使用基于 block 的 API 来枚举数组和其他集合:
[array enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
// do something with object
}];
您也可以使用 -enumerateObjectsWithOptions:usingBlock:
并传递 NSEnumerationConcurrent
和/或 NSEnumerationReverse
作为选项参数。
10.5 之前的标准习惯用法是使用 NSEnumerator
和 while 循环,如下所示:
NSEnumerator *e = [array objectEnumerator];
id object;
while (object = [e nextObject]) {
// do something with object
}
我建议保持简单。将自己绑定(bind)到数组类型是不灵活的,并且声称使用 -objectAtIndex:
的速度提高对于 10.5+ 上的快速枚举的改进是微不足道的。 (快速枚举实际上在底层数据结构上使用了指针算法,并消除了大部分方法调用开销。)过早的优化从来都不是一个好主意——它会导致更困惑的代码来解决一个无论如何都不是你的瓶颈的问题。
当使用 -objectEnumerator
时,您可以很容易地更改为另一个可枚举集合(如 NSSet
,键入 NSDictionary
等),甚至切换到 -reverseObjectEnumerator
以向后枚举数组,所有这些都无需更改其他代码。如果迭代代码在一个方法中,您甚至可以传入任何 NSEnumerator
并且代码甚至不必关心它正在迭代的 什么。此外,只要有更多对象,NSEnumerator
(至少由 Apple 代码提供的那些)就会保留它正在枚举的集合,因此您不必担心自动释放的对象将存在多长时间。
NSEnumerator
(或快速枚举)保护您免受的最大影响可能是在您在您不知情的情况下重新列举它。如果您按索引访问对象,您可能会遇到奇怪的异常或一个错误(通常在问题发生很久之后),这对于调试来说可能是可怕的。使用标准惯用语之一进行枚举具有“快速失败”行为,因此当您在发生突变后尝试访问下一个对象时,问题(由不正确的代码引起)将立即显现出来。随着程序变得越来越复杂和多线程,甚至依赖于第三方代码可能修改的东西,脆弱的枚举代码变得越来越成问题。封装和抽象 FTW! :-)
关于objective-c - 如何迭代 NSArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/992901/
在我的应用程序中,我必须创建这样的结构: $arrProducts = array( array( “product_id” => “1”, “qty” =>
我相信我的问题涉及指针,这是一个我经常纠结的概念,但这就是我正在尝试做的事情。 我有六个 NSArray。我想要一个由这六个数组组成的额外 NSArray,所以: self.arr1 = [NSArr
我正在使用 VKSdk 制作 iOS 应用程序.我想将数据从 response.json[@"items"](它是 nsarray,response.json 是它的 nsdictionary)复制到
我创建 NSArray *test = @[@[@1,@2,@3,@4], @[@3,@5,@6,@7]]; 这将被视为 nsarray 的 nsarray。 但是当我想用打印出来的时候 NSLog
首先引用下图: 我有一个包含 9 个元素的 NSArray。这 9 个元素中的每一个都包含另外 5 个元素。 我想做的是将 [*][1] 从每个地方带到另一个地方,只包含这些日期。 如何最好地实现这一
我正在尝试将 NSDictionaries 数组排序为基于 NSDictionary valueForKey: 第一个字母之一的字母化数组数组 实际上我想要看起来有点像这样的东西 Array A //
我有一个 NSArray 输出如下: ( { category = 1; categoryname = Random; excuse = "Enter your exc
我是 Objective-C 和 iPhone 的新手 我必须使用值对 NSDictionary 进行排序,并且根据我必须排列该值的键,我已经对数组进行了排序。 //getting values NS
我觉得这很简单,但我就是无法理解它。我有一组星期几供用户选择: NSArray * daysOfTheWeek = [NSArray arrayWithObjects:@"sunday", @"mon
我有一个 NSArray 对象: class Object { var name: String? = nil var id: String? = nil } 我想创建一个具有唯一“名
我只是想将 NSNumbers 的 NSArray 排序为数字顺序,但我不确定最好的方法。以我的思维方式,001 和 002 具有相当的可比性,所以我怀疑两者都可以。对于 003,我不确定当方法需要
我面临一个非常常见的场景。 我有一个 NSArray,它有一个自定义类型的对象,比如 Person。 Person 类具有以下属性:firstName、lastName 和 age。 如何从具有 Pe
我有一个 NSArray,其中填充了大约 30 个 NSDate 格式的日期, 我需要做的是从中创建另一个数组,其中包含从第一个日期到最后一个日期的所有日期的 bool 值。 前数组 111/1/12
NSarray 的简单问题。我将对象存储在 NSMuteableArray 中。[obj1, obj2, obj3] 如果选择了一个对象,我想把它放在数组的前面。 IE。如果选择了 obj3,则: [
我已按字母顺序存储联系人,因此我有联系人列表的数组数组,该数组已显示在屏幕上。现在我想通过姓名搜索联系人,但谓词在这里无法正常工作。我已经完成了下面的代码。 filterArray.filter
对于使用 ARC 的 iOS 5.0 应用程序,我有一个对象的 NSArray,其中包含其他对象的 NSArray。是否可以在不遍历数组的情况下从内部数组中提取对象列表,例如比如,使用 NSPredi
这个问题在这里已经有了答案: Sort NSArray of custom objects based on sorting of another NSArray of strings (5 个答案
我有一个 NSArray 对象,每个对象都包含一个“键”字段 我有另一个带有嵌套NSArrays的NSArray,通过不同的字段“按字段分组”对这些对象进行分组,例如显示名称(字母分组) 例如 @in
我正在尝试在多个 NSArray 中搜索和合并对象。 基本上 NSArray 具有多个 NSArray 和 1 个对象,然后是 NSDictionary。我想检查该对象是否已经存在并将其与现有对象合并
这个问题在这里已经有了答案: Check that the contents of one NSArray are all in another array (9 个回答) 关闭 8 年前。
我是一名优秀的程序员,十分优秀!