2012-07-30 62 views
0

这段代码给我一个100次迭代100次以上的泄漏。如果我写[imageName发布]它崩溃与“发送到释放实例的消息”。我甚至不能想到什么是问题的根源。奇怪的NSString泄漏

NSString* imageName=[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 5)]; 
imageName =[imageName stringByReplacingOccurrencesOfString:@"-" withString:@"_"]; 
imageName =[imageName stringByReplacingOccurrencesOfString:@"." withString:@"-"]; 

[ret setQuestionImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"]]]; 
+0

“ret”从哪里来?你有每个迭代新的?他们都呆在附近吗?如果您保留100张JPEG图像,则容易达到100 MB。 – Thilo 2012-07-30 10:17:40

+0

ret是为每次迭代动态创建的,我每次都释放它 – 2012-07-30 10:19:41

回答

3

问题是由这些便利方法创建的字符串和图像是自动释放的,并且自动释放不会及早发生。但是,如果你明确地释放它们,它们将在autorelease时被双重释放。尝试将所有迭代包装到自动释放池中:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSString *imageName=[NSString stringWithUTF8String:(const char *)sqlite3_column_text(statement, 5)]; 
imageName = [imageName stringByReplacingOccurrencesOfString:@"-" withString:@"_"]; 
imageName = [imageName stringByReplacingOccurrencesOfString:@"." withString:@"-"]; 

[ret setQuestionImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"]]]; 
[pool release]; 
+0

另外,如果您稍微改进了整体编码/缩进样式,那将有助于使代码更具可读性。 :) – 2012-07-30 10:21:12

+0

谢谢!那么,问题是在糟糕的dealloc“ret”对象:) – 2012-07-30 10:28:40