2012-01-17 2 views
0

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

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

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

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

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

EDIT:

Спасибо за первые ответы! Однако проблема все еще сохраняется ... Я отправлю еще немного кода, чтобы немного разобраться. Нить запускается в 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. Еще раз спасибо за поддержку!

ответ

2

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

Я только что понял, что «while» -loop никогда не останавливается. Конечно, это означает, что поток будет продолжать работать, поэтому память не будет выпущена до тех пор, пока приложение не завершится.

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

+0

да, правильно :), но вы все еще можете почитать наши ответы с 1-1 upvote ... :) –

+1

Готово, вы, парни, заслужили это :) – Tybs

+0

Прохладный, спасибо и рад, что вам это удалось. :) –

1

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

+0

Спасибо за ответ: но я должен ответить так же, как H2CO3. Достаточно плохо, это не решило проблему. Мой вопрос обновлен. – Tybs

1

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

- (void) updateThread 
{ 
    @autoreleasepool { 
     // former code here 
    } 
} 
+0

Сказал (а) спасибо: Я просто попробовал это, но он, похоже, не имеет никакого другого эффекта. Я уточнил вопрос с дополнительной информацией. – Tybs

Смежные вопросы