为什么这条线会泄漏内存?

时间:2009-09-09 18:26:13

标签: iphone objective-c memory-leaks

为什么以下这条线会泄漏记忆?

cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:person.imageURL]];

在cellForRowAtIndexPath方法中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PersonCell"];

    if (cell == nil){
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"PersonCell"] autorelease];
    }
    Person *person = [[Person alloc] initWithUserName:[people objectAtIndex:indexPath.row]];

    cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:person.imageURL]];

    cell.textLabel.text = [people objectAtIndex:indexPath.row];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    [person release];

    return cell;
}

以下是来自person.m的相关方法

- (NSURL*) imageURL
{
    return [NSURL URLWithString:[userInfo valueForKey:@"profile_image_url"]];
}

编辑:添加了init方法:

- (id)initWithUserName:(NSString *)user{

    userName = [user copy];
    userInfo = [[TwitterHelper fetchInfoForUsername:userName] retain];  
    updates = [[TwitterHelper fetchTimelineForUsername:userName] retain];

    return self;
}

5 个答案:

答案 0 :(得分:2)

我能想到的唯一可能导致泄漏的事情是你可能会在你的人类中保留imageURL并且在dealloc方法中没有释放。因此,当您释放person时,它会泄漏imageURL属性。

答案 1 :(得分:1)

尝试拆分线并再次测试。它可能会给你一些见解。

NSURL *imgURL = person.imageURL;
NSData *imgData = [NSData dataWithContentsOfURL:imgURL]
cell.imageView.image = [UIImage imageWithData: imgData];

你可以评论后者,看看第一个是否会导致泄密。

你知道泄漏有多大吗?是图像大小还是URL大小?

答案 2 :(得分:1)

UIImage做了很多缓存。如果UIImage持有图像的缓存,它可能会出现泄漏。

答案 3 :(得分:1)

你有人的dealloc吗?

当然,如果你没有在dealloc中释放这三行是泄密:

userName = [user copy];
userInfo = [[TwitterHelper fetchInfoForUsername:userName] retain];  
updates = [[TwitterHelper fetchTimelineForUsername:userName] retain];

答案 4 :(得分:0)

这可能与自动释放有关。

Cocoa中的[NSData dataWithContentsOfURL:...]等构造函数会自动自动释放。该调用相当于[[[NSData alloc] initWithContentsOfURL:...] autorelease]。这可能与它有关。