0

一方面,我只是好奇。

另一方面,我必须以某种方式计算创建的图像数量(以触发一定数量的清理)。不幸的是,内存警告通知我太晚了,应用程序在我有机会做出反应之前就被终止了,所以我想解决这个问题。

我可以用一个全局计数器分散在我的项目周围,在我进行任何 UIImage 操作之前它会递增,但显然这正是我想要避免的,这将导致无法维护的设计。

所以我在考虑子类 UIImage 初始化程序(某种 MYImage 类),而不是在整个项目中使用 MYImage,但 UIImageView 无论如何都会使用 UIImages(也许我可以设置 UIImageView 的 setImage 方法,但我敢打赌 UIKit 在很多情况下使用实际的 _image 实例变量)。

最好的办法是从 UIImage 大小中计算像素数量,这样我就可以将图像内存刷新到给定的像素数之上。

有什么通知吗?通过类别的东西?或者某种 NSObject KVO 观察(对类/方法名称进行文字检查)?你有想法/经验吗?

4

1 回答 1

1

有很多方法可以实现这一点。一种方法是覆盖子类中的一个(或多个)图像创建方法,获取创建的图像的大小,并将其添加到用户默认值以跟踪所有图像的累积大小。例如,我像这样覆盖 imageNamed:

@implementation RDImage

+(UIImage *)imageNamed:(NSString *) name {
    UIImage *anImage = [super imageNamed:name];
    double oldSize = [[NSUserDefaults standardUserDefaults] doubleForKey:@"SizeAsWxH"];
    [[NSUserDefaults standardUserDefaults] setDouble:(anImage.size.width * anImage.size.height) + oldSize forKey:@"SizeAsWxH"];
    if ([[NSUserDefaults standardUserDefaults] doubleForKey:@"SizeAsWxH"] > 6912) {
        NSLog(@"Too big -- do something");
    }
    return anImage;
}

在 applicationDidFinishLaunchingWithOptions: 方法中,我将该键的值设置为零。

在创建图像时的视图控制器中,我只是使用我的类来制作一个新的:

UIImage *anImage = [RDImage imageNamed:....

另一种方法是覆盖 UIImageView 的 setImage: 方法,并在该方法中执行相同的操作。

于 2012-09-26T23:11:23.957 回答