我通过xcode中的分析发现了mem泄漏问题。问题很容易,但我无法理解如何解决它:
考虑一个带有2个按钮和tableview的uiviewcontroller。 button1 =从服务器加载JSON数据并将单元格添加到tableview然后[tableview reloadData]
button2 =从另一台服务器加载JSON数据,然后将单元格添加到tableview,然后重新加载。
好的问题在于:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
....
.....
NSURL *url = [NSURL URLWithString:stringpath];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img;
if(!data) img=[UIImage imageNamed:@"small.jpg"];
else img= [[UIImage alloc] initWithData:data];
cell.imageView.image = img;
好的现在,如果我每次切换时都会用2按钮切换我从UIImage泄漏了,所以我想我需要在重新加载之前“清除”(释放)所有细胞数据?
THX
答案 0 :(得分:2)
在img
中设置后,您应该释放cell.imageView.image
个对象。我更喜欢autorelease
在同一条线上,因为它让我更容易跟踪。
UIImage *img;
if(!data) img=[UIImage imageNamed:@"small.jpg"];
else img= [[[UIImage alloc] initWithData:data] autorelease];
cell.imageView.image = img;
正如另一个答案中所提到的,您可以通过不使用initWithData
来电来节省您的痛苦,而是使用imageWithData
。
细胞会照顾好自己。
答案 1 :(得分:1)
问题不是发布img
,请在下面使用
if (!data)
{
img = [UIImage imageNamed:@"small.jpg"];
cell.imageView.image = img;
}
else
{
img = [[UIImage alloc] initWithData:data];
cell.imageView.image = img;
[img release];
}
答案 2 :(得分:1)
我会替换这一行:
else img= [[UIImage alloc] initWithData:data];
使用:
else img= [UIImage imageWithData:data];
答案 3 :(得分:0)
您不必为UIImage分配内存。您可以按如下方式执行上述实现:
NSData * data = [NSData dataWithContentsOfURL:url];
cell.imageView.image = [UIImage imageWithData:data];
试试这个。