什么是比较所有值的有效和伟大的方式NSArray,包含NSNumbers从floats找到的最大一个和最小的一个?
任何想法如何在Objective-C中做到这一点好看又快?
以下两种方法的优点和缺点是什么:
enumerateUsingBlock
NSArray *myArray = [NSArray new];
[myArray enumerateObjectsUsingBlock:^(id anObject, NSUInteger idx, BOOL *stop) {
if (anObject == someOtherObject) {
[anObject doSomething:idx];
*stop = YES;
}
}];
Run Code Online (Sandbox Code Playgroud)
快速列举
NSArray *myArray = [NSArray new];
int idx = 0
for (id anObject in myArray) {
if (anObject == someOtherObject) {
[anObject doSomething:idx];
break;
}
++idx;
}
Run Code Online (Sandbox Code Playgroud) 我阅读了一些关于块和快速枚举以及GCD等的文章.@Bbum,他写了许多关于GCD和块主题的文章,他说块枚举方法总是比快速枚举方法快或快.你可以在这里阅读他的推理.
虽然这是一次引人入胜的智力对话,但我同意那些说它确实取决于手头任务的人.
我有一些任务需要完成,我需要快速,便宜,高效地完成这些任务.Apple为我们想要枚举数组的方式提供了很多选择,但我不确定选择哪个.
for (id obj in array)
{
/* Do something with |obj|. */
}
Run Code Online (Sandbox Code Playgroud)
[array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
/* Do something with |obj|. */
}];
Run Code Online (Sandbox Code Playgroud)
[array enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
/* Do something with |obj|. */
}];
Run Code Online (Sandbox Code Playgroud)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_apply([array count], queue, ^(size_t idx) {
id obj = [array objectAtIndex: idx];
/* Do something with …Run Code Online (Sandbox Code Playgroud) arrays enumeration objective-c grand-central-dispatch objective-c-blocks
在使用快速枚举时,知道何时到达数组中的最后一个对象的最佳方法是什么?有没有比增加int然后将其与数组长度进行比较更好的方法?
我并不完全理解枚举有多快的细节,但比较以下两种情况:
for(NSObject *object in self.myParent.parentsParents.granfathersMother.cousin.unclesNephew.array) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
与
NSArray *array = self.myParent.parentsParents.granfathersMother.cousin.unclesNephew.array;
for(NSObject *object in array) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
在第一个例子中,它会在每次迭代时通过整个链来获得数组吗?我应该使用第二种方式吗?
我正在阅读关于枚举的NSHipster文章,该文章声称for-in循环比以下更快enumerateObjectsUsingBlock::
除非你在迭代时实际需要数字索引,否则使用for/in NSFastEnumeration循环几乎总是更快.
这个答案为该引用提供了一些反驳:
快速枚举需要从内部表示转换为快速枚举的表示.其中有开销.基于块的枚举允许集合类以最快遍历本机存储格式的速度枚举内容.
从内部表示转移到快速枚举的表示的翻译过程是什么?我知道那里有一些开销,但多少钱?
objective-c ×6
ios ×2
arrays ×1
cocoa-touch ×1
enumeration ×1
for-loop ×1
iphone ×1
nsarray ×1