objective-c - Cocoa NSArray/NSSet : -makeObjectsPerformSelector: vs. 快速枚举

标签 objective-c cocoa macos

我想对存储在 NSSet 中的多个对象执行相同的操作。

我的第一次尝试是使用快速枚举:

for (id item in mySetOfObjects)
    [item action];

效果很好。然后我想到:

[mySetOfObjects makeObjectsPerformSelector:@selector(action)];

现在,我不知道什么是最好的选择。据我了解,这两个解决方案是等效的。但是,是否存在关于优先选择一种解决方案而不是另一种解决方案的争论?

最佳答案

我赞成使用 makeObjectsPerformSelector,因为它允许 NSSet 对象处理它自己的索引、循环和消息调度。编写 NSSet 代码的人最有可能知道实现该特定循环的最佳方法。

在最坏的情况下,他们会简单地实现完全相同的循环,而您获得的只是稍微更简洁的代码(不需要封闭循环)。充其量,他们进行了一些内部优化,代码实际上会运行得更快。

该主题在 Apple 的 Code Speed Performance 中有简要提及。文档,在标题为“展开循环”的部分中。

如果您关心性能,最好的办法是设置一个快速程序,对集合中的对象执行一些选择器。让它运行几百万次,计算两种不同情况之间的差异。

关于objective-c - Cocoa NSArray/NSSet : -makeObjectsPerformSelector: vs. 快速枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582521/

相关文章:

ios - 如何在 iOS 的 cocoapod 库中使用图像 Assets 目录

ios - Xcode 设备模拟器文件

用于 Mac 应用程序的 Facebook API

c# - Xamarin.Mac 模糊 SIGSEGV

macos - SMJobBless 失败,CFErrorDomainLaunchd 代码 9

ios - UIView 及其 subview 上的 UITapGestureRecognizer 在 subview 被点击时一起响应

iphone - 保存数据后 UITableView 没有重新加载

cocoa - 是否可以将 NSTableView 的选择绑定(bind)到另一个 tableview 的选择?

python - 安装 ipython qtconsole mac osx - 在系统上找不到 pyqt

objective-c - 带有 autohidscrollers 的 NSScrollview 会在滚动条隐藏时发出通知