0

我正在使用此代码将内容加载到 NSArray 并且它似乎工作正常但是检测泄漏的仪器指出存在我无法解决的问题:

    - (void) loadPlan: (NSString  *) fName
    {

        short j1;

        fName= [NSString stringWithFormat:@"/%@",  fName];

        [self NewCase];

        NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *docDirectory = [arrayPaths objectAtIndex:0];

        NSString *filePath = [docDirectory stringByAppendingString:fName];
        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];

        if (!fileExists) return;

        NSString *fileContents = [NSString stringWithContentsOfFile:filePath
                                                           encoding:NSUTF8StringEncoding error:nil];


        NSArray *chunks = [fileContents componentsSeparatedByString: @"#"];


      for (i = 0; i <= 100; i++)
         {
            InputV[i] = [[chunks objectAtIndex: i+5] doubleValue];
         }


    ...    
      for (j1 = 0; j1 <= 10; j1++)
        {

            GroupMode[j1] = [[chunks objectAtIndex: 206+j1]   retain];   
        }


     ...
}

在某个地方的初始化方法上,我有:

for (j1 = 0; j1 <= 10; j1++)
     {
           GroupMode[j1] = [[NSString alloc] initWithFormat:@""];
     }

仪器指向 NSAraay *chunks 行代码,但我不确定是什么问题。我需要在某个时候释放它吗?

我很感激任何帮助。

4

3 回答 3

2

在您提到能够调用释放的评论中。因此你没有使用 ARC,因为我注意到你用 iphone 标记了你没有使用 GC。这留下了手动内存管理。

问题似乎是块数组或它们的某些块被过度保留(或释放不足)。你没有显示所有的代码,所以很难说。

确保您没有将它们中的任何一个保留在您未显示的代码中的其他位置。也许向我们展示 loadPlan 方法实现的其余部分。

编辑:现在您添加了更多代码,我也可以扩展此答案。

回答这个问题:对与发布匹配的块的保留调用在哪里?

还有什么是 GroupMode 的声明?它似乎只是一个指针数组。如果是这样,您可能需要在设置新值之前释放旧值。

于 2012-08-09T13:13:01.357 回答
1

让我根据您发布的内容尝试另一个答案。

我假设 GroupMode 是某个类的实例变量,并且声明如下:

NSString* GroupMode[11];

loadPlan 中的第二个循环应该是:

  for (j1 = 0; j1 <= 10; j1++)
    {
        NSString* aChunk = [chunks objectAtIndex: 206+j1];
        if ( GroupMode[j1] != aChunk ) {
            [GroupMode[j1] release];
            GroupMode[j1] = [aChunk retain];
        }   
    }

每次更改 GroupMode 的元素时都应该做类似的事情,并且应该确保在该类的 dealloc 方法中释放所有 GroupMode 持有的对象。

但是,我建议您不要使用普通数组,而是改用 NSArray 和/或 NSMutableArray。

于 2012-08-09T14:15:42.383 回答
0

看看这个答案:

"componentsSeparatedByString" 内存泄漏

问题可能是使用结果的东西过度保留了块中的东西。Instruments 指向这条线,因为它是第一次分配内存的地方,但它可能不是问题的根源。

于 2012-08-09T12:52:53.387 回答