iPhone потенциальная утечка объекта, размещенного в строке ... и сохраненного в - PullRequest
2 голосов
/ 17 января 2011

Я нахожусь в процессе отладки приложения для iPhone, включающего приложение с разделенным видом, запускающее всплывающее окно слева и UINavigatorControl в качестве подробного представления справа. горизонтальный пейзаж.

У меня проблемы с разрешением ошибки:

'Потенциальная утечка объекта, размещенного в сети (что угодно) и сохраненного в' MasterView '

строка, которая выглядит следующим образом:

MasterViewController *masterView = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil andArrayOfTags:[self arrayOfButtonTags:self.language]];

и ошибка появляется в этой строке (несколько строк вниз)

SplitViewDelegate* splitViewDelegate = [[SplitViewDelegate alloc] init];

двойной щелчок по утечке памяти открывает дополнительную информацию (с синими стрелками и тому подобное).

на несколько строк выше объявления masterView, оператор

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged:) name:NSUserDefaultsDidChangeNotification object:nil];

связывает синюю стрелку с линией MasterViewController ... с расширенным сообщением

Метод возвращает объект Objective-C со счетом удержания +1 (ссылка на владельца)

, который затем приводит с синей стрелкой к строке splitViewDelegate выше.

Я не уверен, как устранить эту ошибку ... у кого-нибудь есть мысли по этому поводу? Я думаю, что у меня есть понимание кода, но я новичок в цели c (но у меня есть опыт работы с другими языками), поэтому было бы полезно немного поработать со мной.

Ответы [ 2 ]

4 голосов
/ 17 января 2011

Центр уведомлений и разделенные линии просмотра не имеют ничего общего с вашей проблемой.Это всего лишь границы, которые Xcode решил поставить на предупреждение.Чтобы исправить ошибку, отпустите masterView, когда закончите с ним.Если вы поместите его в свойство или отобразите его представление в окне, вы можете безопасно вызвать release без его освобождения, поскольку он сохраняется в этих процессах.

4 голосов
/ 17 января 2011

Добро пожаловать в удивительный мир управления памятью iPhone.

Всякий раз, когда вы выделяете часть памяти, вы должны обязательно ее освободить.Если вы не используете autorelease, который будет выглядеть следующим образом:

MasterViewController *masterView = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil andArrayOfTags:[self arrayOfButtonTags:self.language]]autorelease];

и

SplitViewDelegate* splitViewDelegate = [[[SplitViewDelegate alloc] init]autorelease];

Вот действительно хороший обзор, который объясняет, как использовать память лучше, чем я мог бы сейчас: http://interfacelab.com/objective-c-memory-management-for-lazy-people (не обращайте внимания на разглагольствования о HN в начале)

Надеюсь, это поможет решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...