【问题标题】:Why is this object a potential leak?为什么这个对象是潜在的泄漏?
【发布时间】:2011-09-09 05:21:16
【问题描述】:

我该如何解决这个潜在的泄漏?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

NSUInteger row = [indexPath row];
Chapter *chapter =[Chapter alloc] ;

switch (indexPath.section) {
    case 0: 
        chapter = [einfuerung objectAtIndex:row];
        break;
    case 1: 
        chapter = [vertiefung objectAtIndex:row];
        break;
    case 2: 
        chapter = [spezial objectAtIndex:row];
        break;
}

if ([[NSFileManager defaultManager] fileExistsAtPath:[chapter urlOnFilesystem]]) {

    dataInstance.chapter = chapter;

    Container *container = [[Container alloc] init];
    [self.navigationController pushViewController:container animated:YES];
    [container release];
}
else{

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Kapitel nicht vorhanden" message:@"Kapitel wurde noch nicht heruntergeladen" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert show];
    [alert release];
}

[chapter release];

}

Xcode 告诉我章节的两个问题。

  1. 此时不拥有的对象的引用计数减量不正确。
    为什么这个对象不归我所有?

  2. 对象的潜在泄漏..(章节)
    如何正确释放?
    [章节自动发布]] ?

【问题讨论】:

    标签: iphone xcode memory-leaks autorelease


    【解决方案1】:

    你不应该在下面的语句中分配章节。

    Chapter *chapter =[Chapter alloc] ;
    

    改为使用下面。

     Chapter *chapter = nil;
    

    我修改了你的代码

    NSUInteger row = [indexPath row];
     Chapter *chapter = nil;
    
    switch (indexPath.section) {
        case 0: 
            chapter = [[einfuerung objectAtIndex:row] retain];
            break;
        case 1: 
            chapter = [[vertiefung objectAtIndex:row] retain];
            break;
        case 2: 
            chapter = [[spezial objectAtIndex:row] retain];
            break;
       default:
            chapter =[[Chapter alloc] init];
            break;
    }
    
    if ([[NSFileManager defaultManager] fileExistsAtPath:[chapter urlOnFilesystem]]) {
    
        dataInstance.chapter = chapter;
    
        Container *container = [[Container alloc] init];
        [self.navigationController pushViewController:container animated:YES];
        [container release];
    }
    else{
    
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Kapitel nicht vorhanden" message:@"Kapitel wurde noch nicht heruntergeladen" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
        [alert release];
    }
    
    [chapter release];
    
    }
    

    【讨论】:

    • @Jhaliya:您想删除代码引用中chapter 的第一个定义。
    • 还是有问题。如果您已在默认情况下分配,那么您需要释放。但在其他情况下,如果你从数组中获取对象,你不应该释放它,因为你不拥有它。
    • 是的,现在它已修复。虽然我想实际上不需要默认情况。如果有三个部分,则可以删除默认大小写和保留消息。但是,我同意最好始终使用默认情况:-P
    【解决方案2】:
    Chapter *chapter =[Chapter alloc];
    

    您还没有发送init,但这不是泄漏的原因。问题出在开关盒上。

    chapter = [einfuerung objectAtIndex:row];

    当你这样做时,你指向一个新的chapter 对象,并且之前分配的对象被泄露了。如果您总是从数组中获取Chapter 对象(即您最多有三个部分),那么您不需要alloc。只需声明它,您也不需要发布它。

    【讨论】:

      【解决方案3】:

      您首先分配一个对象并将其分配给chapter。你忘了初始化它,但这不是问题。

      当您在 switch 语句中覆盖 chapter 时会出现问题。对先前分配的对象的引用丢失,对象因此泄漏。

      你需要做两件事:

      1. Chapter *chapter = nil;
      2. 删除末尾的[chapter release];,因为您不是[someArray objectAtIndex:row] 返回的元素的所有者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多