0

以下代码崩溃。基本上我正在访问保存为文件的非常大的字符串(xml - 包含图像数据)...修改它并将其保存为新名称...在分析时我没有看到此代码有任何泄漏。 .. 但是在重复这个过程 20-25 次之后......应用程序在 iphone 3gs 上崩溃,内存警告级别为 3,它也杀死了整个运行的应用程序......我找不到任何地方这个应用程序泄漏导致内存警告....任何建议

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];
 fileToDuplicate=@"";
 [newName release];
 [pool drain];
 return ;
4

2 回答 2

4

如果您没有看到泄漏的位置,切换到 ARC。就像中间的一天一样清晰:

分配xml

将变量xml设置为零(泄漏!!!!!!)

释放xml(nil) <--- 这什么都不做

最后两个是相反的。您需要在将其设置为 nil之前释放它。如果您不理解这个概念,我建议您阅读更多关于指针的内容。释放消息作用于指针的内容,而不是指针本身。后者没有意义。

于 2012-07-22T02:06:54.047 回答
1

你的问题是这段代码:

 xml=nil;
 [xml release];

您正在将要释放的变量设置为无,然后才有机会被释放...想想看,如果您将一个对象设置为 nil ,则曾经指向该对象的指针不再指向它。现在您没有对要释放的对象的引用,这就是在这种情况下导致内存泄漏的原因。代码应如下所示:

 [xml release];
 xml=nil;
于 2012-07-22T04:51:33.970 回答