【问题标题】:iPhone memory management problemsiPhone内存管理问题
【发布时间】:2011-01-07 12:08:21
【问题描述】:

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

【问题讨论】:

  • 我认为一切看起来都很好,是什么让您认为问题出在这个循环中?
  • 我已经逐行注释了,它必须在这个循环内泄漏。这不是 @selector-call,因为它是一个空方法...问题是 [NSString jsonVALUE] 是否可以使用,因为我在 API 中找不到任何文档...

标签: ios memory-management instruments


【解决方案1】:

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

【讨论】:

  • 我',没有使用 json 库,我确实使用了 som 3rd 方 api,但其中存在内存泄漏(......就像我的代码一样......)所以我使用了 [NSString jsonVALUE]
  • 除非我完全遗漏了什么,否则 jsonVALUE 不是 Apple API 的一部分,它是从哪里来的?
【解决方案2】:

线程执行完毕后,您是否正在耗尽池?

你需要创建一个 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 调用的:

【讨论】:

  • 好的,我会尝试通过在 while 循环内排空池,但它会每隔一秒发生一次,但也许没关系?
【解决方案3】:

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

1

这个..

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

2

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

3

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

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多