作者: gb18030
时间: 2011-7-14 15:52
标题: 求解图片的加载方式
UIImage常用加载图片有3种方式,imageWithContentsOfFile、initWithContentsOfFile、imageNamed,我知道第三个会把图片缓存再内存里不利于释放的,但是小弟三个方法各有什么优劣,哪个可以更有效的管理内存不是很清楚,希望有大牛解析下~
作者: tinyfool 时间: 2011-7-14 16:02
imageWithContentsOfFile = [[initWithContentsOfFile:xxxx] autorelease]
imageNamed会把图片缓存,而且没有明确的释放方法。
一般来说,如果你大量装载,大量释放,如果在一个循环里,那么autorelease是需要循环结束才能真的释放的,而init方法和release可以成对写,这样当然就效果很好,内存不会累积。
但是如果没有特别大的量,imageWithContentsOfFile足以了。
如果有一个图片是界面用图,无论如何也不会释放,那么imageNamed很合适了。或者说imageNamed一般用在不那么动态的时候,主要是省事儿用的。
作者: gb18030 时间: 2011-7-14 16:05
那么可以理解为imageWithContentsOfFile是等同于initWithContentsOfFile的release版吧
这两个方法需要自己去手动release来加强管理么
作者: tinyfool 时间: 2011-7-14 16:08
imageWithContentsOfFile是等同于initWithContentsOfFile的autorelease版
imageWithContentsOfFile肯定不能release了
initWithContentsOfFile如果不自己加autorelease的话,就必须加release
作者: gb18030 时间: 2011-7-14 16:13
理解了,自己看总有点晕晕的
应该去道具里在开个鲜花卡,这样可以送花
作者: tinyfool 时间: 2011-7-14 16:18
哈哈,
作者: NEReader 时间: 2011-7-15 11:53
UIImage常用的加载图片有3种方式: imageNamed , imageWithContentsOfFile , initWithContentsFile .
imageNamed:
UIImage image = [UIImage imageNamed:@"image.gif"] . 得到的对象是autoRelease的。这个方法有点特殊,它在生成image对象的同时,会把图像数据 根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。这对与在应用中有大量相同图片时,非常有用,可以提高性能和内存利用率。
imageWithContentsOfFile :
UIimage image = [UIImage imageWithContentsOfFile:@"path"] 。得到的对象时autoRelease的,当autoReleasePool释放时才释放。不系统缓存。
initWithContentsFile
UIimage image = [[UIImage alloc] init initWithContentsFile] 。 的到的对象没用后,要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。
作者: NEReader 时间: 2011-7-15 18:01
使用imageNamed方式,用同一张图片贴多个imageView应该是经过极大的优化,耗时和内存都极小,而使用imageWithContentsOfFile则有巨大消耗:
生成的UIImage对象内存地址 生成10万个相同文件名 使用相同文件名的185
的UIImage对象的内 个 UIImageView对象
存 及耗时 进行贴图
内存:28.70M->32.90M 内存:29.69M-32.84M
imageNamed方式 同一个内存地址 耗时:瞬时 耗时:瞬时
imageWith 内存:29.38M->300.96M 内存:30.21M->537.57M
ContentsOfFile 各不相同的内存地址 耗时:30秒 耗时:40秒以上
方式
UIImage常用加载图片有3种方式,imageWithContentsOfFile、initWithContentsOfFile、imageNamed,我知道第三个会把图片缓存再内存里不利于释放的,但是小弟三个方法各有什么优劣,哪个可以更有效的管理内存不是很清楚,希望有大牛解析下~
作者: tinyfool 时间: 2011-7-14 16:02
imageWithContentsOfFile = [[initWithContentsOfFile:xxxx] autorelease]
imageNamed会把图片缓存,而且没有明确的释放方法。
一般来说,如果你大量装载,大量释放,如果在一个循环里,那么autorelease是需要循环结束才能真的释放的,而init方法和release可以成对写,这样当然就效果很好,内存不会累积。
但是如果没有特别大的量,imageWithContentsOfFile足以了。
如果有一个图片是界面用图,无论如何也不会释放,那么imageNamed很合适了。或者说imageNamed一般用在不那么动态的时候,主要是省事儿用的。
作者: gb18030 时间: 2011-7-14 16:05
那么可以理解为imageWithContentsOfFile是等同于initWithContentsOfFile的release版吧
这两个方法需要自己去手动release来加强管理么
作者: tinyfool 时间: 2011-7-14 16:08
imageWithContentsOfFile是等同于initWithContentsOfFile的autorelease版
imageWithContentsOfFile肯定不能release了
initWithContentsOfFile如果不自己加autorelease的话,就必须加release
作者: gb18030 时间: 2011-7-14 16:13
理解了,自己看总有点晕晕的
![](http://tiny4cocoa.com/images/smilies/default/smile.gif)
应该去道具里在开个鲜花卡,这样可以送花
作者: tinyfool 时间: 2011-7-14 16:18
哈哈,
![](http://tiny4cocoa.com/images/smilies/default/smile.gif)
作者: NEReader 时间: 2011-7-15 11:53
UIImage常用的加载图片有3种方式: imageNamed , imageWithContentsOfFile , initWithContentsFile .
imageNamed:
UIImage image = [UIImage imageNamed:@"image.gif"] . 得到的对象是autoRelease的。这个方法有点特殊,它在生成image对象的同时,会把图像数据 根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。这对与在应用中有大量相同图片时,非常有用,可以提高性能和内存利用率。
imageWithContentsOfFile :
UIimage image = [UIImage imageWithContentsOfFile:@"path"] 。得到的对象时autoRelease的,当autoReleasePool释放时才释放。不系统缓存。
initWithContentsFile
UIimage image = [[UIImage alloc] init initWithContentsFile] 。 的到的对象没用后,要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。
作者: NEReader 时间: 2011-7-15 18:01
使用imageNamed方式,用同一张图片贴多个imageView应该是经过极大的优化,耗时和内存都极小,而使用imageWithContentsOfFile则有巨大消耗:
生成的UIImage对象内存地址 生成10万个相同文件名 使用相同文件名的185
的UIImage对象的内 个 UIImageView对象
存 及耗时 进行贴图
内存:28.70M->32.90M 内存:29.69M-32.84M
imageNamed方式 同一个内存地址 耗时:瞬时 耗时:瞬时
imageWith 内存:29.38M->300.96M 内存:30.21M->537.57M
ContentsOfFile 各不相同的内存地址 耗时:30秒 耗时:40秒以上
方式