Проблема размера NSImage - PullRequest
1 голос
/ 01 июля 2011

Я использую один и тот же ресурс изображения в двух разных контроллерах.В обоих контроллерах изображение показывается в разных размерах, проблема в том, что как только изображение показывается в меньшем размере, чем оригинал, в следующий раз, когда я получу изображение на [NSImage imageNamed:@"resource.png"], размер изображения будет установлен на последний размер,Я попытался вызвать метод recache для NSImage, а также попытался установить для режима кэширования любое возможное значение, но оно не сработало.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Вы никогда не должны изменять экземпляр NSImage, полученный из imageNamed:. Возвращенный экземпляр используется совместно с другими клиентами, поэтому его не следует изменять.

Если вам нужно setSize: на изображении, просто сделайте копию и используйте ее:

NSImage *image = [[[NSImage imageNamed:@"foo.png"] copy] autorelease];
[image setSize:(NSSize){128, 128}];
1 голос
/ 01 июля 2011

Дело в том, что

[NSImage imageNamed]

Как вы упомянули, он находится в кеше, и, пока он находится в кеше, он будет возвращать кэшированное изображение, поэтому вам нужно сначала освободить предыдущую ссылку или использовать метод setName объекта и значение nil. Вот ссылка на документацию:

Класс NSImage может кэшировать ссылку на возвращенный объект изображения для производительности в некоторых случаях. Тем не менее, класс удерживает кэшированные объекты только тогда, когда объект существует. Если объект изображения впоследствии освобождается, либо из-за того, что его счетчик хранения был равен 0, либо на него не ссылались нигде в приложении для сбора мусора, объект может быть незаметно удален из кэша. Таким образом, если вы планируете удерживать возвращенный объект изображения, вы должны сохранить его так же, как любой объект Какао. Вы можете явно удалить объект изображения из кэша, вызвав setName: метод объекта и передав nil для имени изображения.

...