2

朋友们,

我在仪器中运行我的代码,它在 5 行中显示内存泄漏(超出以下代码),即 cell = [[[NSBundle mainBundle] loadNibNamed:@"ZoomCustomVideoCell" owner:self options:nil] objectAtIndex:0];

我不知道为什么它在那里显示内存泄漏以及相同的解决方案是什么

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"ZoomCustomVideoCell";

    ZoomCustomVideoCell *cell = (ZoomCustomVideoCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"ZoomCustomVideoCell" owner:self options:nil] objectAtIndex:0];

        cell.m_zoomMsg = [[[ZoomMessage alloc] init] autorelease];
        [[cell m_zoomMsg] initWithJSON:[m_tmpVideoList objectAtIndex: indexPath.row]];
        [[cell videoLabel] setText:[cell.m_zoomMsg _from]];
        [[cell m_labelLocation] setText:[NSString stringWithFormat:@"%@", cell.m_zoomMsg._location]];
        [[cell videoLabelB] setText:[cell.m_zoomMsg _uploadDesc]];
        NSLog(@"UserName: %@", [[cell videoLabel] text]);

        [cell refreshImage];

    }

    return cell;
}
4

2 回答 2

1

该方法将作为nib 的“文件所有者”loadNibNamed:owner:options:传递的参数。owner:这意味着笔尖中的插座将连接到您作为所有者传递的任何内容。由于您是self作为所有者传递的,因此它将用self新加载的笔尖中的那些覆盖任何先前分配的出口。为了建立插座连接,笔尖加载器setValue:forKey:在提供的所有者上使用。如果您已将 outlet 设置为具有正确内存管理的属性,则应该没有泄漏。如果您仅将您的插座作为实例变量,那么(尚不清楚,但我假设)对象在设置时会自动保留。

这里有两种解决方案:

  1. 为您的插座提供适当的内存管理,例如,如果它们还没有,则将它们转换为属性,并确保它们具有正确的内存管理属性。

  2. 为该方法提供一个不同的所有者loadNibNamed:owner:options:,一个尚未建立任何插座的所有者,并且您知道将适当地处理插座的一个所有者。

于 2013-01-31T09:46:45.020 回答
0

此行导致内存泄漏:

cell = [[[NSBundle mainBundle] loadNibNamed:@"ZoomCustomVideoCell" owner:self options:nil] objectAtIndex:0];

将其更改为:

cell = [[[[NSBundle mainBundle] loadNibNamed:@"ZoomCustomVideoCell" owner:self options:nil] objectAtIndex:0] autorelease];
于 2012-10-25T08:14:53.173 回答