Цель XCode C - Помощь с ошибкой NSAutoreleaseNoPool с помощью NSThread

Привет эксперты, у меня небольшие проблемы с NSThread. XCode продолжает выдавать мне "* __NSAutoreleaseNoPool (): объект 0x5694dc0 класса NSCFString автоматически освобожден без пула на месте - просто утечка" ошибок.

Я правильно объявляю пул строкой NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

затем в конце цикла я использую: [релиз пула];

Это потому, что я использую метод делегата в качестве executeSelectorInBackground? Спасибо stackru.

    - (void)preFetch { //process filenames to be downloaded and assign types to each one
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSArray *regions = [NSArray arrayWithObjects: @"dr_national", @"ds_ir", @"conus_FL360", @"FL360_conus", @"dr_nw", @"dr_nc", @"dr_ne", @"dr_sw", @"dr_sc", @"dr_se", @"ds_ir_nw", @"ds_ir_nc", @"ds_ir_ne", @"ds_ir_sw", @"ds_ir_sc", @"ds_ir_se", nil];
    NSError* error;
    for (NSString *regionDir in regions) {
        NSLog(@"region now: %@", regionDir); foo = 0;
        NSString *regUrl = [NSString stringWithFormat:@"http://someUrl/%@/index.lst", regionDir ];
        NSString* text1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:regUrl ] encoding:NSASCIIStringEncoding error:&error];
        NSArray *listItems = [text1 componentsSeparatedByString:@"\n"];
        for (int k=0; k<[listItems count]; k++) {
            if ([[listItems objectAtIndex:k] length] != 0){
                NSString *newpath = [NSString stringWithFormat:@"http://someUrl/%@", [listItems objectAtIndex:k]];
                NSLog(@"newpath: %@",newpath);
                [self performSelectorInBackground:@selector(moveProgressBar) withObject:nil];
                [self fetchImages:newpath:type]; //pass multiple arguments to fetchImages, newpath and type
            }
        }
    }
    [pool release];
}

    - (void)moveProgressBar{
        [delegate increaseAmount];
    }

1 ответ

Решение

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

- (void)moveProgressBar
{
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     [delegate increaseAmount];
     [pool drain];
}

редактировать

Сказав это, глядя на сам код, кажется, что вы, возможно, пытаетесь обновить пользовательский интерфейс из фонового потока? Любой код, который это делает, должен выполняться в главном потоке.

Если у вас есть длительный процесс, который вы хотите запустить, который не блокирует пользовательский интерфейс и постоянно обновляет информацию о ходе выполнения, типичным шаблоном будет выполнение самой обработки в фоновом потоке и периодическое обновление пользовательского интерфейса с использованием performSelectorOnMainThread:,

Другие вопросы по тегам