2

我分离了一个调用我的方法的线程,它有一个while循环。即使我将它们标记为autoreleasepool,我还是手动释放对象,因为 while 循环可以继续运行一段时间。

问题是一段时间后,应用程序由于内存问题而崩溃。如果我查看 Instruments,我可以看到分配了一大堆 NSString,并在图中创建了通往天堂的阶梯。我没有释放什么?

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];  
}  
4

3 回答 3

0

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

1

这个..

[self performSelectorOnMainThread:@selector(updatePlayerTable:) withObject:scores waitUntilDone:NO]; 正在通过分数,这些分数可能会被其他东西保留,并且也会保留它包含的所有对象。

2

score 是一个 nsmutablearray 并被明确定义为 NOT THREAD SAFE 但您正在跨线程传递它。

3

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

于 2010-01-23T12:00:35.017 回答
0

我没有看到任何明显的东西,您的 JSON 库中是否存在问题?

于 2010-01-20T22:21:39.020 回答
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];
}

并且 doStuff: 使用 detachNewThreadSelector 调用:

于 2010-01-20T22:26:18.900 回答