如何覆盖框架类中的方法(运行时)
问题 :
框架将在上面缓存图像数据:
[UIImage imageNamed:]
我不希望缓存发生,所以我可以替换它
[UIImage imageOfContentOfFile:]
似乎已经解决了,但在我的测试之后,在xib的实例化进度中,框架使用了imageNamed:而不是imageOfContentOfFile 。
也就是说,xib加载的图像仍然被缓存。
所以我尝试覆盖UIImage的imageNamed:方法,使所有这些方法都不要高速缓存。
–try1。 类别:
@implementation UIImage (ImageNamedNoCache) + (UIImage *)imageNamed:(NSString *)name; { NSString* path = [[NSBundle mainBundle] pathForResource:name ofType:nil]; return [UIImage imageWithContentsOfFile:path]; } @end
–result:警告。“类别正在实施一种方法,该方法也将由其主要类实现”
–try2。 运行时替换方法的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);
–当我调用 [UIImage imageNamed:]时,这些也只能尝试
但是xib的实例化不起作用。
帮帮我,谢谢
听起来像是方法调整的工作。 我发现它很危险且没必要,但如果你这么倾向,那就是一种选择。 使用风险由您自己承担。
类别方法应该没问题,只需给你的方法一个不同的名称。 我的理解是,覆盖一个类别中的方法并不是一个好习惯,但添加一个新方法很好。
如果我没有正确解释,请纠正我,但看起来你的核心问题是你在加载xibs时试图让框架(即Apple代码)调用imageWithContentsOfFile而不是imageNamed。
第三种选择可能是将UIImageViews作为占位符留在xib“blank”中,然后以编程方式将UIImages稍后加载到它们中(例如在FileOwner的init代码中),也许借助于’tag’属性+一个字典确定正确的图像,如果方便的话。 或者您甚至可以动态创建图像和视图,而不是将它们保存在xib文件中。 显然这里有很多权衡。
- 你的解决方案并不好:)使用缓存是有充分理由的。
- 只是不要使用
[UIImage imageNamed:]
在你的代码中,一切都会好的 - 如果您实际上不需要缓存图像,则应使用方法#2。
注意 :来自XIBS的图像(实际上是所有对象)正在加载-[object initWithCoder:]
,而不是[UIImage imageNamed:]
或[UIImage imageWithContentsOfFile:]