iOS-UIImage内存分析

UIImage的多个方法,在内存处理上方式不一,所以,需要分情况分析。

以加载多张同样的图片为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *images;
@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
_images = [NSMutableArray new];
for(int i = 0; i < 100000; ++i)
[_images addObject:[UIImage imageNamed:@"Background"]];
}

- (void)didReceiveMemoryWarning
{
_images = nil;
}

@end

imageNamed

十万张,模拟低内存警告前后,内存从209.8M降低到203.2M,变化不大,说明imageNamed方法会对图片进行缓存,对于同一张图片,不会重复创建对象,但是,这也导致了即使将引用置为零,其也不会自动释放内存,因为系统内部有缓存。

imageWithContentsOfFile

十万张,模拟低内存警告前后,内存从1.12G降低到645.3M,变化非常大,说明imageWithContentsOfFile方法不会进行缓存,将引用置为零,会自动释放内存。

imageWithData

一千张,模拟低内存警告前后,内存从363.9M降低到29M,变化非常大,说明imageWithData方法不会进行缓存,将引用置为零,会自动释放内存。

总结:

  • imageNamed会缓存,如果图片很小,或者可能被复用,应该使用imageNamed;
  • imageWithContentsOfFile不缓存,可以通过引用置零来释放内存,但是释放不是特别彻底,可能内部还是保留了一些对象,对于不复用,又不需要释放非常彻底时,可以使用imageWithContentsOfFile;
  • imageWithData不缓存,可以通过引用置零来释放内存,释放非常彻底,但是其在创建时,非常占用内存,所以,如果对于不复用,Data不是特别大,又需要彻底释放的图片,可以使用imageWithData