我在两个不同的控制器中使用相同的图像资源。在两个控制器中,图像以不同的大小显示,问题是一旦图像显示的尺寸小于原始图像,下次我通过[NSImage imageNamed:@"resource.png"]
获取图像时,图像大小设置为最后的大小花了。我尝试在NSImage上调用recache方法,并尝试将缓存模式设置为任何可能的值,但它不起作用。
有什么想法吗?
答案 0 :(得分:3)
您永远不应修改从NSImage
获得的imageNamed:
实例。返回的实例与其他客户端共享,因此不应更改。
如果您必须在图片上setSize:
,只需制作副本并使用该副本:
NSImage *image = [[[NSImage imageNamed:@"foo.png"] copy] autorelease];
[image setSize:(NSSize){128, 128}];
答案 1 :(得分:1)
事情是那个
[NSImage imageNamed]
正如您所提到的那样,只要它在缓存中,它将返回缓存的图像,因此您需要做的是首先发布前一个引用或使用对象的setName方法并设置为nil。这是文档参考:
在某些情况下,NSImage类可以缓存对返回的图像对象的引用以提高性能。但是,只有在对象存在时,类才会保留缓存对象。如果随后释放图像对象,或者因为其保留计数为0或者在垃圾收集的应用程序中没有引用它,则可以从缓存中悄悄地删除该对象。因此,如果您计划保留返回的图像对象,则必须像保存任何Cocoa对象一样保留它。 您可以通过调用对象的setName:方法并为图像名称传递nil来显式清除缓存中的图像对象。