多次在cell中加载网络图片后,内存增长,以前资源未释放

nicookly 2014-09-22 12:44:47
NSString *kURL = [NSString stringWithFormat:@"pathxxxxx",[[dict objectForKey:@"id"] intValue]];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation];


-(void)downloadImage:(NSString *)url{
NSURL *nsUrl = [NSURL URLWithString:url];
NSData *data = [[NSData alloc]initWithContentsOfURL:nsUrl];
UIImage * image = [[UIImage alloc]initWithData:data];
performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}

还有就是根据下载好的图片进行重新绘制成指定大小时 ,每绘制一次内存就会增加,而且以前绘制的图片(即当前已不在使用的)好像也没释放掉,不知道为什么?绘制图片调用了如下函数UIGraphicsBeginImageContextWithOptions,drawInRect,UIGraphicsGetImageFromCurrentImageContext , UIGraphicsEndImageContext();
...全文
304 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicookly 2014-09-23
  • 打赏
  • 举报
回复
引用 10 楼 zhangao0086 的回复:
[quote=引用 9 楼 nicookly 的回复:] [quote=引用 6 楼 zhangao0086 的回复:] [quote=引用 4 楼 nicookly 的回复:] [quote=引用 3 楼 zhanglei5415 的回复:] 本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;[/quote] 方便把工程打包上传到CSDN或百度盘里吗?因为cellForRow调用两次的问题这样真的不好猜,或者你在cellForRow里下断点,结合堆栈,看下两次调用的时机[/quote] 我传了viewcontorller部分代码到CSDN上,请您帮看下http://download.csdn.net/detail/nicookly/7960091[/quote] 你的numberOfRowsInSection方法调用了两次吧[/quote] 大神 ,不知道 能否加你QQ 我的QQ273575009 我这问题都耽误了几天了 实在是急着解决 不知道能否加QQ下
nicookly 2014-09-22
  • 打赏
  • 举报
回复
引用 10 楼 zhangao0086 的回复:
[quote=引用 9 楼 nicookly 的回复:] [quote=引用 6 楼 zhangao0086 的回复:] [quote=引用 4 楼 nicookly 的回复:] [quote=引用 3 楼 zhanglei5415 的回复:] 本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;[/quote] 方便把工程打包上传到CSDN或百度盘里吗?因为cellForRow调用两次的问题这样真的不好猜,或者你在cellForRow里下断点,结合堆栈,看下两次调用的时机[/quote] 我传了viewcontorller部分代码到CSDN上,请您帮看下http://download.csdn.net/detail/nicookly/7960091[/quote] 你的numberOfRowsInSection方法调用了两次吧[/quote] 没有啊,不是只有初始化时和reloadData 时才会去调用一次numberOfRowsInSection么
Bannings 2014-09-22
  • 打赏
  • 举报
回复
引用 9 楼 nicookly 的回复:
[quote=引用 6 楼 zhangao0086 的回复:] [quote=引用 4 楼 nicookly 的回复:] [quote=引用 3 楼 zhanglei5415 的回复:] 本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;[/quote] 方便把工程打包上传到CSDN或百度盘里吗?因为cellForRow调用两次的问题这样真的不好猜,或者你在cellForRow里下断点,结合堆栈,看下两次调用的时机[/quote] 我传了viewcontorller部分代码到CSDN上,请您帮看下http://download.csdn.net/detail/nicookly/7960091[/quote] 你的numberOfRowsInSection方法调用了两次吧
nicookly 2014-09-22
  • 打赏
  • 举报
回复
引用 6 楼 zhangao0086 的回复:
[quote=引用 4 楼 nicookly 的回复:] [quote=引用 3 楼 zhanglei5415 的回复:] 本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;[/quote] 方便把工程打包上传到CSDN或百度盘里吗?因为cellForRow调用两次的问题这样真的不好猜,或者你在cellForRow里下断点,结合堆栈,看下两次调用的时机[/quote] 我传了viewcontorller部分代码到CSDN上,请您帮看下http://download.csdn.net/detail/nicookly/7960091
ReyZhang 2014-09-22
  • 打赏
  • 举报
回复
引用 7 楼 nicookly 的回复:
[quote=引用 5 楼 zhanglei5415 的回复:] [quote=引用 4 楼 nicookly 的回复:] [quote=引用 3 楼 zhanglei5415 的回复:] 本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;[/quote] 你是想在点击这个cell后,再重新渲染该cell吗?如果是的话,不需要全部都reload,这样的话,可显示的cell都需要渲染一遍。可想而知,这是多么的没有必要。如果只是当前点击的cell,你可以使用reloadRowAtIndexPaths: 这个方法来重新渲染当前点击的cell。只有你指定的这些cell可以被重新渲染render[/quote] 我这点击cell 的效果,是要将当前的所有的cell都重新渲染,相当于点击一个cell 进入下一级目录,并将当前目录中的每条标题进行显示[/quote] 你不需要这样啊。你只需要在点击此cell后,组织出来下一级的数据源,然后使用push操作跳转到同结构的控制器(注意:和上一个控制器是两个不同的实例,虽然显示的布局及控制器class一样)。这样做的好处: 只关注显示的逻辑,上一层与下一层的交互更容易(push or pop operation)。
nicookly 2014-09-22
  • 打赏
  • 举报
回复
引用 5 楼 zhanglei5415 的回复:
[quote=引用 4 楼 nicookly 的回复:] [quote=引用 3 楼 zhanglei5415 的回复:] 本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;[/quote] 你是想在点击这个cell后,再重新渲染该cell吗?如果是的话,不需要全部都reload,这样的话,可显示的cell都需要渲染一遍。可想而知,这是多么的没有必要。如果只是当前点击的cell,你可以使用reloadRowAtIndexPaths: 这个方法来重新渲染当前点击的cell。只有你指定的这些cell可以被重新渲染render[/quote] 我这点击cell 的效果,是要将当前的所有的cell都重新渲染,相当于点击一个cell 进入下一级目录,并将当前目录中的每条标题进行显示
Bannings 2014-09-22
  • 打赏
  • 举报
回复
引用 4 楼 nicookly 的回复:
[quote=引用 3 楼 zhanglei5415 的回复:] 本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;[/quote] 方便把工程打包上传到CSDN或百度盘里吗?因为cellForRow调用两次的问题这样真的不好猜,或者你在cellForRow里下断点,结合堆栈,看下两次调用的时机
ReyZhang 2014-09-22
  • 打赏
  • 举报
回复
引用 4 楼 nicookly 的回复:
[quote=引用 3 楼 zhanglei5415 的回复:] 本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;[/quote] 你是想在点击这个cell后,再重新渲染该cell吗?如果是的话,不需要全部都reload,这样的话,可显示的cell都需要渲染一遍。可想而知,这是多么的没有必要。如果只是当前点击的cell,你可以使用reloadRowAtIndexPaths: 这个方法来重新渲染当前点击的cell。只有你指定的这些cell可以被重新渲染render
nicookly 2014-09-22
  • 打赏
  • 举报
回复
引用 3 楼 zhanglei5415 的回复:
本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
谢谢你的回答,我现在遇到个问题,想咨询你一下, 就是我--》》 didSelectRowAtIndexPath中调用一次[self.tableview reloadData] 后, 且 numberOfRowsInSection的返回值为1,却调用了两次cellForRowAtIndexPath,也创建了两次cell,且只显示一行(cell是用xib 实现的自定义cell)不知道什么原因?我看了下代码 却是是只调用了一次reloadData;
ReyZhang 2014-09-22
  • 打赏
  • 举报
回复
本身图片的加载就很耗资源,即使你是使用异步加载。出来后又做图片缩放操作,内存不增加才怪。其实优化的解决方案在服务器端,如果图片在上传服务器时就可根据需要生成相应尺寸的缩略图,那么在ios客户端加载时的好处多多,首先,图片小了,省流量,下载速度快。再者,你也不需要再为如何缩放图片而导致内存不断增加的问题而担心。这是我的建议,请参考。
nicookly 2014-09-22
  • 打赏
  • 举报
回复
引用 1 楼 zhangao0086 的回复:
image被绘制到哪了?
// 创建一个bitmap的context // 并把它设置成为当前正在使用的context UIGraphicsBeginImageContextWithOptions(targetSize,NO,2); // 绘制改变大小的图片 [image drawInRect:CGRectMake(0, 0, targetSize.width, targetSize.height)]; // 从当前context中创建一个改变大小后的图片 UIImage* targetImage = UIGraphicsGetImageFromCurrentImageContext(); // 使当前的context出堆栈 UIGraphicsEndImageContext(); // 返回新的改变大小后的图片 return targetImage; } 然后UIImage * curImage = [self OriginImage:image byScalingToSize:targetSize]; 然后在cell的imageView中显示
Bannings 2014-09-22
  • 打赏
  • 举报
回复
image被绘制到哪了?

29,031

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧