отпустить или не выпустить контроллер - PullRequest
1 голос
/ 20 апреля 2011

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

Мой сценарий:

Это простое приложение для электронных книг.У меня есть основной вид, из которого пользователь может открыть два модальных вида.Основная проблема в одном из модальных представлений.Там у меня есть прокрутка, которая управляет всеми страницами.Прямо сейчас есть 12 страниц.Я пытался выпустить все и т. Д., Но что-то осталось в памяти, потому что в инструментах память продолжает расти, и когда я закрываю модальное представление и возвращаюсь, через несколько раз он падает.Страницы являются отдельными символами XIB, и я загружаю их следующим способом:

    - (void)loadScrollViewWithPage:(int)page {
if (page < 0) return;

if (page >= MyNumberOfPages) return;

if ((NSNull *)controller != [NSNull null]) {

    NSString *className = [NSString stringWithFormat:@"Pagina%d", page];
    Class myClass = NSClassFromString(className);

    controller = [[myClass alloc] initWithNibName:className bundle:nil];

// I have tried autorelease and even retain] autorelease.

           [viewControllers replaceObjectAtIndex:page withObject:controller];

    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    if (page != 0){
    controller.view.tag = page;
    }else {
        controller.view.tag = 9999;
    }

    [scrollView addSubview:controller.view];
    [scrollView sendSubviewToBack:controller.view];

            [controller release];


    }
}

Каждый раз загружаю 3 страницы, одну видимую, левую и правую.Я пытаюсь разгрузить (удалить или избавиться) их таким образом (для тех, кто вокруг 3 загружен):

[viewControllers removeObjectAtIndex:pagi - 2];
[[scrollView viewWithTag:pagi - 2] removeFromSuperview];

Так что у меня две проблемы ... Если я отпускаю контроллер, как я делаюв методе выше, мои IBActions на некоторых страницах приводят к сбою приложения.Но если я все равно отпущу его и удалю IBActions, память тоже будет расти.В Инструментах он не показывает утечек, но он падает после увеличения 1 МБ или 2 МБ памяти.

Я вошел в систему всех страниц viewDidUnload и deallocs, и они выгружаются только при наличии предупреждения о памяти.

Наконец, что более странно для меня, это то, что если я не использую [выпуск контроллера];приложения остаются больше времени без сбоев.Но, конечно, они не имеют значения.

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

Есть идеи?

1 Ответ

0 голосов
/ 20 апреля 2011

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

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

[[myClass alloc] initWithNibName:className bundle:nil];

Итак, вы должны отпустить его, потому что вы его выделили. Если вы используете alloc, сохраните или скопируете, вы несете ответственность за освобождение этих объектов.

Но я догадываюсь, в чем твоя проблема. Как вы определили controller? Это iVar или тоже собственность? Если это свойство, у вас есть проблема с управлением памятью, потому что «старое» значение не освобождается. В этом случае используйте self.controller вместо controller.

Иначе я не могу себе представить, почему происходит сбой приложения, когда доступен только этот код. ; -)

Сандро Мейер

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