代码之家  ›  专栏  ›  技术社区  ›  jps

何时释放。仪器显示我漏水

  •  0
  • jps  · 技术社区  · 14 年前

    而不是做什么。

    我有以下代码:

    NSString* rawTickerData = [[NSString alloc] initWithData: op.requestData encoding:NSUTF8StringEncoding];
    NSArray* lines   = [rawTickerData componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
    
    for(NSString* line in lines)
    {
        NSArray* fields = [line componentsSeparatedByString:@","];
    
        if([fields count] > 1)
        {
            [self.tickerData addObject:fields];
        }
    }
        [rawTickerData release]
    

    仪器告诉我 fields

    同样的事情也会发生在你身上 lines

    2 回复  |  直到 14 年前
        1
  •  1
  •   Kris Markel    14 年前

    除非我遗漏了什么,否则你发布的代码是正确的。 fields 是一个自动释放的对象,添加到 self.tickerData . lines

    如果你在任何地方漏水,那是因为你没有好好清理self.tickerData文件. 如果你把这句话注释掉 [self.tickerData addObject:fields]; line,你还在收到泄漏报告吗?如果没有,一定要打电话 [tickerData release] self.tickerData = nil )在某个地方,可能在你的房间里 dealloc

        2
  •  0
  •   dombesz    14 年前

    在这些情况下,最好的做法是在每个循环结束时释放对象的,如果保留它们的话。在这种情况下,你的 fields 变量获取 autorelease 对象,最好的选择是使用 NSAutoReleasePool

    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    
    NSString* rawTickerData = [[NSString alloc] initWithData: op.requestData encoding:NSUTF8StringEncoding];
    NSArray* lines   = [rawTickerData componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
    
    for(NSString* line in lines)
    {
        NSArray* fields = [line componentsSeparatedByString:@","];
    
        if([fields count] > 1)
        {
            [self.tickerData addObject:fields];
        }
        [pool drain];
    }
    [rawTickerData release];
    

    如果不需要,这将刷新所有自动释放的对象。如果不使用自动释放池,则在方法终止之前,对象一直处于活动状态。 如果这不能解决泄漏问题,我建议按以下方式初始化阵列:

    NSArray *lines = [[NSArray alloc]initWithArray:[line componentsSeparatedByString:@","]];
    //and release at the end of the loop
    [lines release];