【问题标题】:NSImage size problemNSImage 大小问题
【发布时间】:2011-07-01 14:37:42
【问题描述】:
我在两个不同的控制器中使用相同的图像资源。在两个控制器中,图像以不同的尺寸显示,问题是一旦图像以比原始尺寸更小的尺寸显示,下次我通过[NSImage imageNamed:@"resource.png"] 获取图像时,图像尺寸将设置为上次使用的尺寸.我尝试通过调用 NSImage 上的 recache 方法,还尝试将缓存模式设置为任何可能的值,但它不起作用。
有什么想法吗?
【问题讨论】:
标签:
objective-c
macos
nsimage
【解决方案1】:
您不应该修改从imageNamed: 获得的NSImage 实例。返回的实例与其他客户端共享,因此不应更改。
如果你必须在图片上setSize:,只需复制并使用那个:
NSImage *image = [[[NSImage imageNamed:@"foo.png"] copy] autorelease];
[image setSize:(NSSize){128, 128}];
【解决方案2】:
事情是这样的
[NSImage imageNamed]
正如你提到的在缓存中,只要它在缓存中,它就会返回缓存的图像,所以你需要做的是首先释放以前的引用或使用对象的 setName 方法并将其设置为 nil。这是文档参考:
在某些情况下,NSImage 类可能会缓存对返回的图像对象的引用以提高性能。但是,该类仅在对象存在时才保留缓存的对象。如果图像对象随后被释放,要么是因为它的保留计数为 0,要么在垃圾收集应用程序中的任何地方都没有引用它,那么该对象可能会从缓存中悄悄地删除。因此,如果您打算保留返回的图像对象,则必须像保留任何 Cocoa 对象一样保留它。 您可以通过调用对象的 setName: 方法并为图像名称传递 nil 来显式地从缓存中清除图像对象。