iPhone内存管理问题

时间:2010-01-20 22:17:46

标签: ios memory-management instruments

我分离了一个调用我的方法的线程,该方法有一个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];  
}  

3 个答案:

答案 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)

好吧我看到的一些大问题是

1

此..

[self performSelectorOnMainThread:@selector(updatePlayerTable :) withObject:scores waitUntilDone:NO]; 传递的分数可以被其他东西保留,并且还会保留它包含的所有对象。

2

得分是一个nsmutablearray,并明确定义为NOT THREAD SAFE,但是你将它传递给线程。

3

那些[blah JSONvalue]的东西应该是自动释放的,而不是苹果api,苹果没有iphone的公共JSON api。这很可能是SBJSON库,它将类别放在apple类(nsstring,nsarray,nsdictionary等)上,以方便JSON解析。