2012-07-21 40 views
0

下面的代碼崩潰。基本上我正在訪問一個非常大的字符串(xml -contains圖像數據)保存爲文件...修改它並將其保存在一個新的名稱。 ..分析時,我沒有看到任何泄漏與此代碼...但重複此過程20-25次後...該應用程序崩潰在iPhone 3gs內存警告級別三,它殺死了整個應用程序也運行... ...我找不到哪裏這個程序是泄漏到導致內存警告任何地方....任何建議保存一個大的nsstring文件多次崩潰應用程序

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documents = [paths objectAtIndex:0]; 
NSString *filename = [NSString stringWithFormat:@"%@.yyy",fileToDuplicate]; 
NSString *initPath = [documents stringByAppendingPathComponent:filename]; 
NSString *final = [NSString stringWithFormat:@"%@.yyy",[[alertView textFieldAtIndex:0] text]]; 
NSString *finalPath = [documents stringByAppendingPathComponent:final]; 
NSString *newName=[[[alertView textFieldAtIndex:0] text] copy]; 
NSError *error; 
NSString *xml = [[NSString alloc] initWithContentsOfFile:initPath encoding:NSASCIIStringEncoding error:&error] ; 
NSString *xml_1=[xml stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"<file_name><name>%@.yyy</name></file_name>",fileToDuplicate] withString:[NSString stringWithFormat:@"<file_name><name>%@.yyy</name></file_name>",newName]]; 
NSString *xml_2=[xml_1 stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"<property_name>%@</property_name>",fileToDuplicate] withString:[NSString stringWithFormat:@"<property_name>%@</property_name>",newName]]; 
[xml_2 writeToFile:finalPath atomically:YES encoding:NSASCIIStringEncoding error:&error]; 
xml=nil; 
[xml release]; 
xml_1=nil; 
xml_2=nil; 
[self.mTableView reloadData]; 
[email protected]""; 
[newName release]; 
[pool drain]; 
return ; 
+3

也許你應該只打開ARC,刪除所有'釋放'調用,並檢查它是否仍然崩潰。 – kennytm 2012-07-21 21:14:20

回答

4

如果您沒有看到這個漏水然後開關ARC。這是因爲白天在中間清晰:

的Alloc xml

設置變量xml爲零(泄漏!!!!!)

發佈的xml的內容(這是零)< - - 這什麼都不做

最後兩個是相反的。你需要釋放它之前你把它設置爲零。如果你不理解這個概念,我建議你多閱讀一下指針。釋放消息作用於指針的內容,而不是指針本身。後者是沒有意義的。

1

你的問題是這樣的代碼:

xml=nil; 
[xml release]; 

要設置要釋放到什麼它會釋放一個機會面前......想想看,如果你設置的目的是零的變量用於指向該對象的指針不再指向它。現在你沒有對要釋放的對象的引用,這就是爲什麼內存泄漏導致了這種情況。代碼應該如下:

[xml release]; 
xml=nil; 
相關問題