-1

从历史上看,当使用 [UIImage imageNamed:] 将 imageView 中的图像与某些预定义图像进行比较时,我已经成功地使用了 == 比较器。这是因为我在使用相同的文件名重复调用 [UIImage imageNamed:] 时收到相同的对象,例如:

(lldb) po [UIImage imageNamed:@"foo.png"]
<UIImage: 0x7a1433a0>

(lldb) po [UIImage imageNamed:@"foo.png"]
<UIImage: 0x7a1433a0>

(lldb) po [UIImage imageNamed:@"foo.png"]
<UIImage: 0x7a1433a0>

使用 Xcode 6 Beta 4,在尝试将 imageView 中的图像与预期图像进行比较时,我的许多单元测试都失败了,这似乎是因为我每次都获得了具有给定文件名的图像的唯一实例,而不是上面解释的旧行为。在 Xcode 6 Beta 4 中做同样的事情时,我得到了这个:

(lldb) po [UIImage imageNamed:@"foo.png"]
<UIImage: 0x7a691f00>

(lldb) po [UIImage imageNamed:@"foo.png"]
<UIImage: 0x7a6a1d00>

(lldb) po [UIImage imageNamed:@"foo.png"]
<UIImage: 0x7a1f3230>

(lldb) po [UIImage imageNamed:@"foo.png"]
<UIImage: 0x7a6a1fd0>

这是预期的行为,是我在 UIImage 的文档中缺少的东西,也许是我应该以不同方式解决的实现问题,还是我应该将其作为错误提交给 Apple?有什么见解吗?

4

2 回答 2

1

我只是在 iOS 7 中尝试了同样的事情,并且得到了预期的输出(即所有变量的相同对象)但是当我在 iOS 8 中运行相同的事情时,我得到了不同的对象。(两次都使用 Xcode 6 beta 4)

所以我检查了我们拥有的iOS 7文档:

 +(UIImage *)imageNamed:(NSString *)name 

此方法在系统缓存中查找具有指定名称的图像对象,如果存在则返回该对象。如果匹配的图像对象尚未在缓存中,则此方法从指定文件加载图像数据,缓存它,然后返回结果对象。

iOS 8

 +(UIImage *)imageNamed:(NSString *)name 

此方法在系统缓存中查找具有指定名称的图像对象,如果存在则返回该对象。如果缓存中没有匹配的图像对象,则此方法从磁盘或资产目录中定位并加载图像数据,然后返回结果对象。你不能假设这个方法是线程安全的。

seconde 文本中没有任何内容准确指定此调用缓存数据,因此可能有人参与(这没有任何意义)或者它是一个错误。我的建议是发送错误报告,看看他们会说什么。

阿玉。

于 2014-08-06T15:43:43.083 回答
0

如果您想要比较它们的内容,请不要通过它们的实例地址来比较对象!

当然,它有时是巧合,但不能保证——正如你所发现的那样。

Apple 可以随意更改此类实施细节,恕不另行通知。

编写您自己的比较方法,可能只比较初始部分,因为这是测试代码。

于 2014-08-06T15:48:36.583 回答