以下代码崩溃。基本上我正在访问一个非常大的字符串(xml -contains图像数据)保存为文件...修改它并将其保存为新名称...当分析时我没有看到任何泄漏这段代码......但是在重复这个过程20-25次之后...应用程序在内存警告级别为3的iphone 3gs上崩溃并且它杀死了整个应用程序运行...我无法找到这个应用程序泄漏的任何地方引起记忆警告....任何建议
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 ;
答案 0 :(得分:4)
如果您没有看到泄漏的位置,请 切换到ARC。它和中间的日子一样清晰:
Alloc xml
将变量xml
设置为nil(LEAK !!!!!)
发布xml
的内容(这是零)&lt; ---这不做任何事情
最后两个是相反的。您需要在之前将其设置为,然后将其设置为nil。如果你不理解这个概念,我建议你多阅读一下指针。释放消息作用于指针的内容,而不是指针本身。后者没有意义。
答案 1 :(得分:1)
你的问题是这段代码:
xml=nil;
[xml release];
您正在设置要释放的变量,然后才有机会被释放...想想看,如果您将一个对象设置为nil指针用于指向该对象不再指向该对象。现在您没有对要释放的对象的引用,这就是导致这种情况导致内存泄漏的原因。代码应如下:
[xml release];
xml=nil;