NSImage大小问题

时间:2011-07-01 14:37:42

标签: objective-c macos nsimage

我在两个不同的控制器中使用相同的图像资源。在两个控制器中,图像以不同的大小显示,问题是一旦图像显示的尺寸小于原始图像,下次我通过[NSImage imageNamed:@"resource.png"]获取图像时,图像大小设置为最后的大小花了。我尝试在NSImage上调用recache方法,并尝试将缓存模式设置为任何可能的值,但它不起作用。

有什么想法吗?

2 个答案:

答案 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来显式清除缓存中的图像对象。