Xcode 4.2.1: NSThread причинява изтичане на памет, използвайки ARC

Наближавам края на училищен проект с програмиране в Xcode, но точно сега имам малък, но изключително досаден проблем: изтичане на памет. Течът е проследен до следния ред код:

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

Когато коментирам това, течът изчезна. Очевидно нещо се обърка в autoreleasepool: все още съм малко нов в тези (особено когато използвам 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.2.1. Благодаря отново за подкрепата!


person Tybs    schedule 17.01.2012    source източник


Отговори (3)


В момента просто искам да се ударя с камък.

Току-що разбрах, че цикълът "while" никога не спира. Разбира се, това означава, че нишката ще продължи да работи, следователно паметта никога няма да бъде освободена, докато приложението не приключи.

Чрез просто добавяне на булева стойност, която е зададена на "НЕ", когато нишката трябва да излезе, проблемът беше решен. Всички: Благодаря ви много, че разгледахте този проблем вместо мен. Понякога най-големите проблеми имат най-малките решения...

person Tybs    schedule 18.01.2012
comment
да, нали :) но все още можете да почетете нашите отговори с 1-1 гласуване за... :) - person ; 18.01.2012
comment
Готово, заслужихте го :) - person Tybs; 21.01.2012

Блокът @autoreleasepool влиза в кода на вашата нишка (updateThread в този случай), а не около създаването на нишката.

person Rob Napier    schedule 17.01.2012
comment
Благодаря за отговора: но трябва да отговоря по същия начин като на H2CO3. Лошото е, че това не реши проблема. Въпросът ми е актуализиран. - person Tybs; 18.01.2012

Вие не създавате пул за автоматично освобождаване в метода на отделен селектор. Всеки селектор на нишки се нуждае от собствен пул. Направете така:

- (void) updateThread
{
    @autoreleasepool {
        // former code here
    }
}
person Community    schedule 17.01.2012
comment
Благодаря: Току-що опитах това, но не изглежда да има друг ефект. Актуализирах въпроса с повече информация. - person Tybs; 18.01.2012