UIImage的多个方法,在内存处理上方式不一,所以,需要分情况分析。
以加载多张同样的图片为例:
1 | @interface ViewController () |
imageNamed
十万张,模拟低内存警告前后,内存从209.8M降低到203.2M,变化不大,说明imageNamed方法会对图片进行缓存,对于同一张图片,不会重复创建对象,但是,这也导致了即使将引用置为零,其也不会自动释放内存,因为系统内部有缓存。
imageWithContentsOfFile
十万张,模拟低内存警告前后,内存从1.12G降低到645.3M,变化非常大,说明imageWithContentsOfFile方法不会进行缓存,将引用置为零,会自动释放内存。
imageWithData
一千张,模拟低内存警告前后,内存从363.9M降低到29M,变化非常大,说明imageWithData方法不会进行缓存,将引用置为零,会自动释放内存。
总结:
- imageNamed会缓存,如果图片很小,或者可能被复用,应该使用imageNamed;
- imageWithContentsOfFile不缓存,可以通过引用置零来释放内存,但是释放不是特别彻底,可能内部还是保留了一些对象,对于不复用,又不需要释放非常彻底时,可以使用imageWithContentsOfFile;
- imageWithData不缓存,可以通过引用置零来释放内存,释放非常彻底,但是其在创建时,非常占用内存,所以,如果对于不复用,Data不是特别大,又需要彻底释放的图片,可以使用imageWithData。