Xcode 4.2.1: NSThread вызывает утечку памяти, используя ARC - PullRequest
0 голосов
/ 17 января 2012

Я близок к завершению школьного проекта с программированием на Xcode, но сейчас у меня небольшая, но крайне раздражающая проблема: утечка памяти.Утечка прослеживается до следующей строки кода:

@autoreleasepool {
    [NSThread detachNewThreadSelector:@selector(updateThread) toTarget:self withObject:nil];
}

Когда я это комментирую, утечка исчезла.Видимо, что-то идет не так в автозапуске: я все еще немного новичок в этом (особенно при использовании ARC), но потоки типа этот дали мне понять, что использования @autoreleasepool должно быть достаточно.

По какой-то причине это не относится к моему коду.Я полагаю, что здесь чего-то не хватает: если бы кто-то мог дать какие-то идеи о том, что это может быть за проблема, тогда это было бы высоко оценено.Просто скажите мне, если мне придется публиковать больше кода, это не будет проблемой: просто для удобства чтения я пытаюсь ограничить его основной проблемой.

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Спасибо за первые ответы!Проблема все еще сохраняется, однако ... Я опубликую немного больше кода, чтобы прояснить ситуацию немного.Поток запускается в viewDidLoad:

/*
 Everything mentioned here will be done after loading.
 */
- (void)viewDidLoad
{
    // Do standard setup
    [super viewDidLoad];

    // Do any additional setup before loading the view from its nib.
    self.title = @"Blog Manager";

    // Activate edit mode
    [tbvBlogList setEditing:YES animated:YES];
    tbvBlogList.allowsSelectionDuringEditing = YES;

    [NSThread detachNewThreadSelector:@selector(updateThread) toTarget:self withObject:nil];

    UIImage *btnImage = [UIImage imageNamed:@"iPhone_General_Button_Add_Blog.png"];
    UIButton *viewBtnAddBlog = [UIButton buttonWithType:UIButtonTypeCustom];
    [viewBtnAddBlog setImage:btnImage forState:UIControlStateNormal];
    viewBtnAddBlog.frame = CGRectMake(0, 0, 80, 36);
    [viewBtnAddBlog addTarget:self action:@selector(addBlogByButton:) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *btnAddBlog = [[UIBarButtonItem alloc] initWithCustomView:viewBtnAddBlog];
    btnAddBlog.tintColor = [UIColor clearColor];
    self.navigationItem.rightBarButtonItem = btnAddBlog;
}

Затем другие функции, которые используются для создания потока:

/*
 Thread to update the progress bar with.
 */
- (void)updateThread
{
    @autoreleasepool {
        while(YES){
            [self performSelectorOnMainThread:@selector(updateProgressBar) withObject:nil waitUntilDone:false];
            [NSThread sleepForTimeInterval:0.1f];
        }
    }
}

/*
 Updates the progress bar.
 */
- (void)updateProgressBar
{
    pvProgress.progress = dProgress;
}

Если это стоит упомянуть: я использую Xcode 4.20,1.Еще раз спасибо за поддержку!

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Сейчас я просто хочу ударить себя камнем.

Я только что понял, что цикл while никогда не останавливается. Конечно, это означает, что поток будет продолжать работать, поэтому память никогда не будет освобождена, пока приложение не завершит работу.

Просто добавив логическое значение, для которого установлено значение «НЕТ», когда поток должен выйти, проблема была решена. Все: большое спасибо за внимание к этой проблеме для меня. Иногда самые большие проблемы имеют самые маленькие решения ...

1 голос
/ 17 января 2012

Вы не создаете пул автоматического выпуска в методе отдельного селектора. Каждый селектор потоков нуждается в своем собственном пуле. Делай так:

- (void) updateThread
{
    @autoreleasepool {
        // former code here
    }
}
1 голос
/ 17 января 2012

Блок @autoreleasepool входит в код вашего потока (в данном случае updateThread), а не в создание потока.

...