2012-08-09 24 views
0

我使用這個代碼來加載內容的NSArray和它似乎做工精細但儀器檢測泄漏點存在,我不能把我的手指上了一個問題:加載文件內容的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]; 
     } 


    ... 
} 

,並在init方法在某處,我有:

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

儀器指向NSAraay *塊行代碼,但我不知道有什麼問題。我需要在某個時候發佈它嗎?

我很感激任何幫助。

+0

你是如何管理內存的?您正在使用ARC,GC還是手動內存管理? – 2012-08-09 12:44:01

+0

@Analog文件我使用任何默認的方法,我沒有發起任何事情。例如,如果我有:pool = [[NSAutoreleasePool alloc] init]; Items = [[NSMutableArray alloc] initWithCapacity:91]; 然後在dealloc方法中我有[Items release]; – 2012-08-09 12:51:49

回答

2

在你提到可以調用發佈的評論中。因此,你不使用ARC,因爲我注意到你使用iPhone標記,所以你沒有使用GC。這留下了手動內存管理。

這個問題似乎是塊數組或一些塊它們過度保留(或低估)。你沒有顯示所有的代碼,所以很難說。

請確保你沒有保留在你沒有顯示的代碼中的其他地方。也許向我們展示loadPlan方法實現的其餘部分。

編輯:現在你添加了更多的代碼,我也可以擴展這個答案。

回答這個問題:哪裏是與發佈相匹配的塊的保留調用?

什麼是GroupMode的聲明?它似乎只是一個指針數組。如果是這樣,您可能需要在設置新值之前釋放舊值。

+0

我編輯我原來的帖子並添加了一些相關的代碼。我已經看到,當我執行InitWithFormat時,我不需要使用Alloc,並且可能我必須在loadPlan方法中釋放大塊值。我只是想確保在程序中仍然保留GrouPMode值,並且能夠根據需要進行修改。請給出意見。 – 2012-08-09 13:53:25

+0

也進行編輯以反映添加到OP的新信息。 – 2012-08-09 14:02:16

+0

你是正確的NSString * GroupMode [11];指針數組。就像我添加匹配的版本等,並解決問題。現在我看到一個測試的另一部分泄漏,我正在使用儀器(我會盡力解決它或發佈它)。我認爲我需要在將應用程序提交給Apple之前解決所有問題。我的應用程序是通用的,並且可以在iPad和iPhone上運行。有沒有像GC這樣的方式(我不知道它是什麼或ARC),這將釋放我處理內存管理?它更容易嗎?感謝您的輸入。 – 2012-08-09 14:10:27

0

看看這個答案:

"componentsSeparatedByString" Memory leak

這個問題可能是使用效果的東西是在保持從大塊的東西。儀器正在指出這一行,因爲它是第一次分配內存的地方,但它可能不是問題的根源。

+0

感謝您的鏈接和建議,我會檢查它以瞭解更多。 – 2012-08-09 14:11:36

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的元素,你應該抓緊時間做同樣的事情一定要釋放所有GroupMode在類的dealloc方法中的對象。

但是,我建議你不要使用普通數組,而是切換到使用NSArray和/或NSMutableArray。

+0

是的,我明白你的意思。感謝您花時間幫忙,我已經對我的男性管理技能感到更加自信了:) – 2012-08-09 14:31:31