Вопрос по objective-c, ios, runtime – Как переопределить метод в классе фреймворка (время выполнения)

3

проблема:

Framework будет кэшировать данные изображения, когда выше:

[UIImage imageNamed:]

Я нене хочу, чтобы кэширование происходило, поэтому я могу заменить его на

[UIImage imageOfContentOfFile:]

Кажется, решено, но после моих испытаний, в Xib 'инстанцировать прогресс, использование фреймворкаimageNamed: скорее, чемimageOfContentOfFile.

То есть изображения, загруженные с помощью xib, все еще кэшируются.

Поэтому я пытаюсь переопределить UIImages imageNamed: метод, сделайте весь этот метод НЕ КЕШИТЬ.

--try1. категория:

@implementation UIImage (ImageNamedNoCache)

+ (UIImage *)imageNamed:(NSString *)name; 
{
    NSString* path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
    return [UIImage imageWithContentsOfFile:path];
}

@end

--result: предупреждение «.Категория реализует метод, который также будет реализован своим основным классом "

--try2. время выполнения заменить метод »чертенок

    //get super method
Method method_imageNamed = class_getClassMethod([UIImage class], @selector(imageNamed:));

//get my method
Method method_myImageNamed = class_getClassMethod([self class], @selector(myImageNamed:));

//get my imp
IMP imp_myImageNamed = method_getImplementation(method_myImageNamed);

//set super method's imp to my imp
method_setImplementation(method_imageNamed, imp_myImageNamed);

--результат они тоже стараются работать только когдаЯ призываю [UIImage imageNamed:]

но XIB 'инстанцирование нет работа.

помоги мне спасибо

Какие'не так с категорией? Вы можете использовать директивы clang, чтобы довольно легко подавить предупреждение. Не то чтобы яЯ рекомендую сделать это, но я полагаю, у вас есть веская причина не допускать кэширования ваших изображений. Carl Veazey

Ваш Ответ

4   ответа
0
Ваше решение неt хорошо :) Кэширование используется по уважительным причинам.Просто нет использовать[UIImage imageNamed:] В ВАШЕМ коде и все будет хорошоесли тыНа самом деле не нужно кэшировать ваши изображения, вы должны использовать метод № 2.

НОТА: Изображения (фактически, все объекты) из XIBS загружаются с-[object initWithCoder:]а не с[UIImage imageNamed:] или же[UIImage imageWithContentsOfFile:]

0

если я не правильно интерпретирую, но похоже, что ваша основная проблема в том, что вы пытаетесь заставить фреймворк (то есть код Apple) вызывать imageWithContentsOfFile вместо imageNamed при загрузке XIBS.

Третий вариант может быть оставить UIImageViews в XIB 'пустой» в качестве заполнителя, а затем программной загрузки UIImages в них позже (например, в FileOwner 's init code), возможно, с помощьютег' свойство + словарь, чтобы определить правильное изображение, если онос удобно. Или вы можете даже динамически создавать изображения и их представления вместо того, чтобы хранить их в файле XIB. Очевидно, что здесь есть много компромиссов.

Сделайте NSDictionary * dict, который отображается между целыми числами (ключами) и именами изображений (значениями). В своем xib изменитетег' свойство каждого UIImageView в целое число, соответствующее изображению, которое 'должен заполнить его. В вашем методе init вашего подкласса итерируйте ваши UIImageViews следующим образом: for (NSNumber * n in [dict allKeys]) {UIImageView * iview = [mySuperView viewWithTag: [n intValue]]; NSString * imagename = [dict valueForKey: n]; [iview initWithImage: ... etc ....]} Тогда вы можете загрузить свои UIImages, как вам нравится. Merk
да, у меня была та же мысль, что и у тебя раньше, но когда я раскладываю свой взгляд,не совсем понятно, какой элемент управления или imageView I 'м макета, конечно, я могу очистить свойство изображения после макета, хм, некоторые решения лучше? ткс :) user1610768
1

метод метания, Я считаю это опасным и ненужным, но если вы так склонны, этоявляется опция. Используйте на свой риск.

Я читал это раньше, мойtry2" это что-то вроде этого, но может не работать.tks ~ user1610768
0

просто дайте вашему методу другое имя. Это'я понимаю, что этоНе рекомендуется переопределять методы в категории, но добавление нового - это нормально.

Проблема переопределить метод, который загружает изображение во время XIB 's instantiation.If только я использую его, конечно, я могу создать другой метод, а не переопределять его. user1610768

Похожие вопросы