仪器显示[NSBundle mainBundle] loadNibNamed上的内存泄漏

时间:2012-10-25 07:58:18

标签: objective-c ios

我在仪器中运行我的代码,它在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;
}

2 个答案:

答案 0 :(得分:1)

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

这里有两种解决方案:

  1. 为您的网点提供适当的内存管理,例如:如果它们尚未存在,请将它们转换为属性,并确保它们具有正确的内存管理属性。

  2. loadNibNamed:owner:options:方法提供不同的所有者,该方法尚未建立任何商店,而您知道的商店将适当处理商店。

答案 1 :(得分:0)

此行导致内存泄漏:

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

将其更改为:

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