我分离了一个调用我的方法的线程,该方法有一个while循环。即使我将它们标记为autoreleasepool
,我也会手动释放对象,因为while循环可以继续使用一段时间。
问题是,一段时间后,应用程序因内存问题而崩溃。如果我查看乐器,我可以看到分配了大量的NSStrings,并在图表中创建了通往天堂的阶梯。我没有发布什么?
while (keepGettingScores)
{
NSString *jsonString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSDictionary *json = [jsonString JSONValue];
[jsonString release];
NSMutableArray *scores = [[NSMutableArray alloc] init];
[scores setArray:(NSMutableArray*)[[jsonString JSONValue] objectForKey:@"scores"]];
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"totalScore" ascending:NO];
[scores sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
[sorter release];
[self performSelectorOnMainThread:@selector(updatePlayerTable:) withObject:scores waitUntilDone:NO];
[scores release];
[NSThread sleepForTimeInterval:1.0];
}
答案 0 :(得分:0)
我没有看到任何明显的内容,您的JSON库中是否存在问题?
答案 1 :(得分:0)
你的线程执行完毕后你是在耗尽你的池吗?
你需要创建一个NSAutoreleasePool并在你的线程执行完毕后调用它的drain方法。
在我的一个项目中,我有一个需要创建大量自动释放对象的线程,并发现在线程运行时定期耗尽池是有用的。
- (void)doStuff:(NSObject *)parent {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
/* Do lots of stuff *.
/* Periodically, I'd drain and recreate the pool */
[pool drain];
pool = [[NSAutoreleasePool alloc] init];
/* The rest of my stuff */
[pool drain];
}
使用detachNewThreadSelector调用doStuff:
答案 2 :(得分:0)
好吧我看到的一些大问题是
此..
[self performSelectorOnMainThread:@selector(updatePlayerTable :) withObject:scores waitUntilDone:NO]; 传递的分数可以被其他东西保留,并且还会保留它包含的所有对象。
得分是一个nsmutablearray,并明确定义为NOT THREAD SAFE,但是你将它传递给线程。
那些[blah JSONvalue]的东西应该是自动释放的,而不是苹果api,苹果没有iphone的公共JSON api。这很可能是SBJSON库,它将类别放在apple类(nsstring,nsarray,nsdictionary等)上,以方便JSON解析。