【问题标题】:Weird Xcode 6 Beta 4 [UIImage imageNamed:] behavior奇怪的 Xcode 6 Beta 4 [UIImage imageNamed:] 行为
【发布时间】:2014-08-06 15:17:54
【问题描述】:

从历史上看,在将 imageView 中的图像与使用 [UIImage imageNamed:] 的某些预定义图像进行比较时,我已经成功地使用了 == 比较器。这是因为我在使用相同的文件名重复调用[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?有什么见解吗?

【问题讨论】:

  • 你是用什么 iOS 版本构建的?
  • 在 Xcode 5 中它是 7.1,我必须检查一下,但我假设它在测试版中是 8.0。
  • 在 iOS 7.1 中它对我来说正常工作,不一致仅在 iOS 8 中出现

标签: ios objective-c uiimage xcode6 imagenamed


【解决方案1】:

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

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

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

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

iOS 8:

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

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

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

香鱼。

【讨论】:

  • 这就是我要说的。好精神Ayu。
  • 已发送错误 - 尽管我在 3 月份提交的最后一次错误报告仍未得到答复,所以我们拭目以待。谢谢!
  • 他们可能更改了底层缓存行为并忘记更新文档。您能否发布错误跟踪器 ID 以便我们对其进行监控?
【解决方案2】:

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

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

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

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

【讨论】:

  • 我不会称之为“巧合”。文档说它 imageNamed 返回“.. 与指定文件名关联的图像对象。”,它没有说 AN 图像,它说的是图像。那么,如果不是 ==,如何测试 imageView 中的图像是否为“foo.png”?
  • 查看更新的答案。您需要比较内容。如果你愿意牺牲 100% 的保证,那就有捷径可走。也许比较地址,如果比较内容或部分不匹配,请参阅答案:编写自己的比较方法。
  • 重新评论:向 Apple 提交文档错误,因为您觉得这很混乱。
  • 所以你说我不应该期望它总是有效: UIImage *fooImage = [UIImage imageNamed:@"foo.png"]; UIImageView *iv = [[UIImageView alloc] initWithImage:fooImage]; iv.image == fooImage
  • 是的,不要指望它会起作用。一直以来的规则是,如果是需要比较的内容,则不比较地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2014-11-06
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多