Странное поведение Xcode 6 Beta 4 [UIImage imageNamed:]
Исторически я успешно использовал компаратор == при сравнении изображения в 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 как ошибку? Есть идеи?
2 ответа
Я только что попробовал то же самое в iOS 7, и у меня был ожидаемый результат (т.е. один и тот же объект для всех переменных), но когда я запускаю одно и то же в iOS 8, я получаю разные объекты. (Оба раза с использованием Xcode 6 beta 4)
Итак, я проверил документы для iOS 7 у нас есть:
+(UIImage *)imageNamed:(NSString *)name
Этот метод ищет в системных кэшах объект изображения с указанным именем и возвращает этот объект, если он существует. Если соответствующий объект изображения еще не находится в кэше, этот метод загружает данные изображения из указанного файла, кэширует его и затем возвращает полученный объект.
+(UIImage *)imageNamed:(NSString *)name
Этот метод ищет в системных кэшах объект изображения с указанным именем и возвращает этот объект, если он существует. Если соответствующий объект изображения еще не находится в кэше, этот метод находит и загружает данные изображения из каталога диска или ресурса, а затем возвращает полученный объект. Вы не можете предполагать, что этот метод является потокобезопасным.
Во втором тексте нет ничего, что точно указывает, что этот вызов кэширует данные, так что, возможно, он посещен (что не имеет никакого смысла), или это ошибка. Мой совет - отправить сообщение об ошибке и посмотреть, что они скажут.
Ая.
Не сравнивайте объекты по адресам их экземпляров, если вы хотите сравнить их содержимое!
Конечно, иногда это работает по стечению обстоятельств, но нет никакой гарантии - как вы выяснили.
Apple может по своему усмотрению изменять такие детали реализации без предварительного уведомления.
Напишите свой собственный метод сравнения, возможно, сравнивая только начальную часть, поскольку это тестовый код.