释放tableview ios iphone中的所有单元格

时间:2011-03-22 17:42:21

标签: iphone ios memory-leaks tableview

我通过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

4 个答案:

答案 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];

试试这个。