2013-12-11 2 views
0

Инструменты утечки предупредить меня об утечке памяти, связанной с этой части кода:Objective-C Утечка памяти на addSubview

[self.contview addSubview:nav.view]; 

Здесь находятся, как я управляю мнение:

[nav.view removeFromSuperview]; 
    self.nav = [[[destinationClass alloc] initWithNibName:pagename bundle:nil] autorelease]; 
    [self.contview addSubview:nav.view]; 

ли это нормально, что у self.nav есть saveCount из 2 сразу после выделения? Может ли это быть связано с утечкой памяти?

Я очень новичок в управлении памятью, может кто-нибудь мне помочь?

Большое спасибо

+0

Не могли бы вы опубликовать все связанные с код? Все это выглядит немного странно, но без контекста трудно сказать. –

+0

Вы используете ARC? –

+3

www.whentouseretaincount.com - 'keepCount' не имеет значения. Используйте инструмент распределения, чтобы увидеть трассировку стека каждого события сохранения/выпуска. – bbum

ответ

2

Предполагая, что nav является сильным (сохранить) имущество, он сохраняет контроллер представления вы назначаете здесь: эффективно

self.nav = [[[destinationClass alloc] initWithNibName:pagename bundle:nil] autorelease]; 

, то сохранить счетчик после этой строки кода 1; +2 для alloc и retain и -1 для autorelease. Как правило, вы никогда не должны использовать метод retainCount, чтобы определить фактическое количество удержаний объекта, может быть, this answer даст вам больше понимания, почему. Каждые alloc, retain или copy звонок должен совпадать с вызовом release или autorelease. Вы должны добавить вызов релиз соответствия в dealloc методе вашего класса

-(void) dealloc { 
    [_nav release]; 
    _nav = nil; 
    [super dealloc]; 
} 

Не используйте ручное управление памятью, использовать ARC, это сделает вашу жизнь намного проще :)

+1

Конечно, значение RC равным 2 на самом деле не отражает «авторекламу», и, следовательно, оно эффективно 1. Но только по совпадению в том, что оно может быть 42 и все еще быть действительным. Абсолютное значение остатка бессмысленно. Действительно, это +1 для alloc, +1 для 'self.nav =' и -1 для авторекламы, давая +1 после выполнения этой строки кода (и, таким образом, требуя, чтобы -1 где-то еще, чтобы сделать этот код правильный). Обратите внимание, что вы должны, вероятно, использовать '[_nav release];' или 'self.nav = nil;', чтобы предотвратить свисающий указатель. – bbum

+0

Вы правы, количество удержаний эффективно 1 после выделения, сохранения и автоопределения, теперь, когда я снова читаю свой ответ, я вижу, что вы пытаетесь указать. Я сделаю небольшую перефразировку :) –

+0

Это 'dealloc' выйдет из строя; просто используйте '[_nav release]; _nav = nil; 'или' self.nav = nil; ', но не смешивайте их. * Обычно * шаблон должен освобождать переменную экземпляра непосредственно в 'dealloc' и назначать непосредственно в' init'. (Хорошее редактирование, btw! Спасибо) – bbum

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