1

我真的在尝试优化我的移动代码UIImageViews

我有一个主要的方法来枚举我所有的UIImageViews.

哪个枚举执行得更快,或者它们的执行完全相同?

示例 1:在此示例中,我列举UIImageViews了我UIViewController认为的所有内容

 for (UIImageView *imageView in self.view.subviews)
{
    ...
}

示例 2:在此示例中,我列举UIImageViews了我的NSMutableArray. 该数组始终包含所有在中UIImageViews找到的内容self.view.subviews(它只是通常在 self.view.subviews 中找到的所有 UIImageViews 的副本,我只需要创建一次)

 for (UIImageView *imageView in self.imageViews)
{
    ...
}

那么哪个示例应该为我提供更快、更优化的枚举呢?请注意,这些是由我设置的 CADisplayLink 不断枚举的。另请注意,self.view.subviews返回一个NSArray所以NSArray当我使用第一个枚举时可能会不断创建它,这让我认为该NSMutableArray方法会执行得更好并且开销更少,但我不确定。

编辑:所有子视图都是UIImageViews. 我也不确定在使用 subviews 属性时是否有任何重大开销,因为它看起来可能会做一些“幕后”工作来让我使用 NSArray。

4

2 回答 2

2

无需遍历子视图,您可以使用该Tag属性非常快速地完成它

例子:

添加标签以UIimageView通过code or xib

myImageView.tag = 1;

然后,

 UIImageView *myImageView = ([[self.view viewWithTag:1] isKindOfClass:[UIImageView class]])?(UIImageView *)[self.view viewWithTag:1]:nil;

关于您的迭代代码

假设所有子视图都是 UIImageViews 那么第一个代码将是最有效的。

for (UIImageView *imageView in self.view.subviews)
于 2013-03-13T03:29:09.943 回答
1

如果您正在处理一个带有几个图像视图的简单视图,那么它可能并不重要,并且性能问题可以忽略不计。在 Instruments 中对这两种方法进行基准测试,如果有明显的差异,我会感到震惊。正如我在上面提到的,您对 a 的使用CADisplayLink可以比以往任何时候都产生更大的性能影响NSMutableArray

但是,从概念上讲,随着您的应用程序变得越来越复杂,遵循MVC模式会带来巨大的好处。在这个世界上,模型(可能由简单的可变数组或复杂的持久存储或网络服务支持)和视图(一旦优化它)之间存在巨大差异,可能仅代表整个模型的一个非常小的子集,采用延迟加载或出列和重用单元格/视图。

一个很好的例子是一个相册应用程序,你有很多相册,每个相册都有很多照片。尝试将所有这些图像加载到图像视图中会很疯狂,例如,如果其中许多图像视图在任何给定时间都不可见,更不用说加载对所有这些图像具有单独的图像视图了。因此,您的模型可能是一些对象结构,可以捕获完整的相册集和对照片的引用,但您的视图可能只有几个图像视图(例如“当前”图像、“下一个”图像和“以前的”图像)。

在这样的场景中,如果您开始尝试将所有图像加载到图像视图中并将所有这些图像视图添加为子视图,那么您会遇到麻烦。即使你这样做了,随着你变得越来越复杂,你可能会发现自己在加载图像视图时使用了图像的再现,这些图像被下采样到适合你的设备或你拥有的设备的分辨率。

因此,简而言之,看看您的简单示例,我认为在创建您NSMutableArray的 .您为呈现和优化用户界面所做的工作)。对于微小的应用程序可能无关紧要,但是随着您的应用程序变得越来越复杂(大量图像,用户界面中有些图像不可见(滚动到屏幕外),那么这种区别变得更加重要。

我们对您的应用了解得不够多,无法说出您在复杂性范围内的位置。听起来它很简单,可能无关紧要,但我认为尽早采用 MVC 思维过程是件好事。

参考

于 2013-03-13T04:41:30.297 回答