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

3

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

[UIImage imageNamed:]

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

[UIImage imageOfContentOfFile:]

Кажется решенным, но после моих тестов, в инстанцированном прогрессе xib, фреймворк используетimageNamed: скорее, чемimageOfContentOfFile.
То есть изображения, загруженные с помощью xib, все еще кэшируются.

Поэтому я пытаюсь переопределить метод imageIId: метод UIImage, чтобы все эти методы НЕ кэшировались.

--try1. category:

@implementation UIImage (ImageNamedNoCache)

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

@end

--result: warning. & quot; Категория реализует метод, который также будет реализован его основным классом & quot;

--try2. runtime replace the method's imp

    //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);

--result они тоже стараются работать только когдаI invoke [UIImage imageNamed:]
но создание экземпляра xib не работает.

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

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

Ваш Ответ

4   ответа
0

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

Проблема заключается в переопределении метода, который загружает изображение при создании экземпляра xib. Если я его использую, то, конечно, я могу создать другой метод вместо переопределения. user1610768
0

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

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

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

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

Я читал это раньше, мой "try2" это что-то вроде этого, но может не работать.tks ~ user1610768
0
Your solution isn't good :) Caching is used for good reasons. Just don't use [UIImage imageNamed:] In YOUR code, and all will be fine If you Actually need not to cache your images, you should use method #2.

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

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