Проблемы с управлением памятью iPhone - PullRequest
2 голосов
/ 21 января 2010

Я отсоединяю поток, вызывающий мой метод с циклом while. Хотя они помечены как autoreleasepool, я освобождаю объекты вручную, поскольку цикл while может продолжаться некоторое время.

Проблема в том, что через некоторое время приложение вылетает из-за проблем с памятью. Если я загляну в Instruments, я вижу огромную кучу выделенных строк NSS и на графике создается лестница в небеса. Что я не смог выпустить?

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 голосов
/ 21 января 2010

Вы истощаете свой пул после завершения потока?

Вам нужно создать NSAutoreleasePool и вызвать его метод стока, когда ваш поток завершит работу.

В одном из моих проектов у меня был поток, который требовал создания множества объектов автоматического выпуска, и он нашел полезным периодически очищать пул во время работы потока.

- (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:

0 голосов
/ 23 января 2010

хорошо, некоторые БОЛЬШИЕ проблемы, которые я вижу,

1

это ..

[self executeSelectorOnMainThread: @selector (updatePlayerTable :) withObject: оценки waitUntilDone: NO]; передает баллы, которые могут быть сохранены чем-то другим, и это также сохранит все содержащиеся в нем объекты.

2

scores - это nsmutablearray, он явно определен как НЕ БЕЗОПАСНЫЙ, а вы передаете его по потокам.

3

эти [бла JSONvalue] вещи должны быть автоматически выпущены, и это не Apple API, у Apple нет общедоступного JSON API для iPhone. это, скорее всего, библиотека SBJSON, которая помещает категории в классы apple (nsstring, nsarray, nsdictionary и т. д.) для удобного анализа JSON.

0 голосов
/ 21 января 2010

Я не вижу ничего вопиющего, может ли быть проблема в вашей библиотеке JSON?

...