3

问题
框架将在上述情况下缓存图像数据:

[UIImage imageNamed:]

我不希望缓存发生,所以我可以用

[UIImage imageOfContentOfFile:]

似乎解决了,但经过我的测试,在 xib 的实例化过程中,框架使用imageNamed:而不是imageOfContentOfFile
也就是说,由 xib 加载的图像仍然被缓存。

所以我尝试覆盖 UIImage 的 imageNamed: 方法,使所有这些方法不缓存。

——试一试。类别:

@implementation UIImage (ImageNamedNoCache)

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

@end

--result:warning."Category 正在实现一个方法,该方法也将由其主类实现"

--尝试2。运行时替换方法的 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 这些也只在我调用[UIImage imageNamed:]时才起作用,
但 xib 的实例化不起作用。

帮帮我,谢谢

4

4 回答 4

1

听起来像是方法调配的工作。我觉得这很危险且没有必要,但是如果您愿意,这一种选择。使用风险自负。

于 2012-09-27T03:37:42.193 回答
0

类别方法应该没问题,只是给你的方法一个不同的名字。我的理解是,在一个类别中覆盖方法不是一个好习惯,但是添加一个新方法是可以的。

于 2012-09-27T04:49:24.783 回答
0

如果我解释不正确,请纠正我,但看起来你的核心问题是你试图让框架(即 Apple 代码)在加载 xibs 时调用 imageWithContentsOfFile 而不是 imageNamed。

第三种选择可能是将 xib '空白'中的 UIImageViews 作为占位符保留,然后稍后以编程方式将 UIImages 加载到它们中(例如在 FileOwner 的初始化代码中),也许在 'tag' 属性 + 字典的帮助下确定正确的图像,如果方便的话。或者您甚至可以动态创建图像及其视图,而不是将它们保存在 xib 文件中。显然,这里有很多权衡。

于 2012-09-27T05:17:21.263 回答
0
  1. 您的解决方案不好:) 使用缓存是有充分理由的。
  2. 只是不要[UIImage imageNamed:]在你的代码中使用,一切都会好起来的
  3. 如果您实际上不需要缓存图像,则应使用方法#2。

注意:来自 XIBS 的图像(实际上是所有对象)正在加载-[object initWithCoder:],而不是[UIImage imageNamed:][UIImage imageWithContentsOfFile:]

于 2012-12-05T18:06:20.950 回答