Вопрос по iphone, automatic-ref-counting, ios, xcode, storyboard – память не освобождается с ARC и раскадровкой в iOS 5.1

3

я ломаю голову над проблемами памяти с моим приложением, приложение работает нормально, за исключением того, что оно падает, как только появляется предупреждение о нехватке памяти, и очень и очень сильно отстает при использовании его в течение 10–20 минут.

РЕДАКТИРОВАТЬ: как poptoviewcontroller?

introvideo- & GT; welcomeview & amp; tutorialview- & GT; mainviewcontroller- & GT; scannerviewcontoller- & GT; вопрос - & gt; (если ответ правильный - & gt; correctView); в противном случае - & gt; неправильный просмотр

Как я могу вернуться к контроллеру MainView?

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

поток моей раскадровки в приложении:

http://dl.dropbox.com/u/418769/storyboard%20flow.png

вступительное видео - & gt; добро пожаловать & amp; учебное представление (если имя пользователя! существует) - & gt; контроллер основного вида

это основной файл, к которому пользователь всегда будет обращаться.

http://dl.dropbox.com/u/418769/scannerViewController.h

http://dl.dropbox.com/u/418769/scannerViewController.m

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

<code>-(void)perform {
    UIViewController *sourceVC = (UIViewController *) self.sourceViewController;
    NSInteger index = -1;
    NSArray* arr = [[NSArray alloc] initWithArray:sourceVC.navigationController.viewControllers];
    for(int i=0 ; i<[arr count] ; i++)
    {
        if([[arr objectAtIndex:i] isKindOfClass:NSClassFromString(@"mainViewController")])
        {
            index = i;
        }       
    }    

    [UIView transitionWithView:sourceVC.navigationController.view duration:0.5
                       options:UIViewAnimationOptionTransitionCrossDissolve
                    animations:^{

                        [sourceVC.navigationController popToViewController:[arr objectAtIndex:index] animated:NO];

                    }
                    completion:^(BOOL  completed)
     {     

             }                      
     ];

}
</code>

Тем не менее, приложение все еще поглощает оперативную память и VRAM.

Я действительно ценю друзей здесь, чтобы помочь решить мой вопрос, Сильное значение вызвало эту проблему?

Это очень раздражает, когда ссылки в SO вопросах не работают. Не могли бы вы их исправить или убрать из вопроса? Ricardo Sanchez-Saez

Ваш Ответ

3   ответа
2

@ken-thomases analysis is spot on. Finding leaks.

I presume you are using ARC?

Can you explain what is the purpose of the above code sample and what your app is doing to require something like this? It feels like you're addressing a symptom rather than solving a problem.

In answer to your question, the use of strong is unlikely to be the source of problems, unless you have strong reference cycles (see Transitioning to ARC). If you follow Ken's suggestions, you'll identify where your app is leaking memory (assuming it is), and if so, where it is. At that point, if you still don't understand the source of the leak, you can post the offending code here and I'm sure there will be plenty of people willing to help. Also, if you have some code that you wonder whether the strong reference is inappropriate, post that relevant code and, again, I'm sure we'll be happy to help if we can.

Я использую пользовательский переход, чтобы получить доступ к главному контроллеру представления, mainViewController находится в стеке nav viewcontroller. я возвращаю вид назад к тому, который имел то же имя, что и mainviewcontroller в стеке, как показано в моем вопросе Desmond
Привет @ Роберт, спасибо за ответ. Да, я с помощью ARC отредактировал мой вопрос вместе с вашим вопросом. Я также разместил один из моих кодов, через который все пользователи пройдут сканирование QR-кода. Desmond
Благодарю. Я вижу, вы делаете много вызовов executeSegueWithIdentifier. Я также вижу, что ваша раскадровка имеет массу переходов, чтобы вернуться кMain View Controller. Вы когда-либо появлялись или отклоняли свои различные контроллеры представления, чтобы вернуться к Основному контроллеру представления, или вы просто выполняете другой переход, чтобы добраться туда? (Если вы делаете последнее, то есть у вас есть круговой набор сегментов, которые могут съесть вашу память.)
3

что используете «пользовательский переход» для перехода к главному контроллеру представления, я не уверен, правильно ли я это понимаю. Ты используешьperformSegueWithIdentifier? Если это так, то вы не попадаете; Вы нажимаете другую копию контроллера основного вида!

В большинстве раскадровок вы не видите переход из дочернего представления с правой стороны, повторяющийся слева от родительского представления (и на снимке экрана показано головокружительное число переходов назад в контроллер основного вида, который немного красного флага). Это гораздо более привычная раскадровка (взято изBeginning Storyboards in iOS 5) у Рея Вендерлиха):

Sample storyboard from Ray Wenderlich Tutorial Обычно вы отклоняете детское представление с чем-то вроде следующего, а не используете переход.

[self.navigationController popViewControllerAnimated:YES];

Если вы хотите вернуться на несколько уровней, вы должны использоватьpopToViewController или жеpopToRootViewControllerAnimated, Или, если вы используете модальные переходы, вы бы отклонили модальные сdismissViewControllerAnimated.

Если я неправильно понял, что вы имеете в виду под «пользовательским переходом к pop», можете ли вы предоставить какой код, который вы используете, сделать для этого?

@Desmond Кстати, если бы это было приложение для iOS 6, вы могли бы использовать раскручивающиеся сегменты, которые значительно упрощают этот процесс. Лично я не совсем готов отказаться от обратной совместимости с iSO 5, но, если это так, раскрутите сегменты, сделайте работу довольно элегантно.
Я предполагаю, что это работает, хотя это кажется мне излишне сложным. Я бы хотел, чтобы мой контроллер основного вида был корневым (и если бы мне нужно было показать приветствие / учебное пособие, я бы создал те дочерние представления, которые открылись бы в том редком случае, когда он вам действительно нужен). Таким образом, простой popToRootViewController всегда будет делать это за вас, и вы можете устранить эту глупость, пытаясь удалить приветствие / учебник из списка контроллеров представления.
Я, конечно, постараюсь значительно упростить пользовательский переход и просто использую popToRootViewController, как описано в моем предыдущем комментарии, и посмотрим, решит ли это ситуацию с потреблением оперативной памяти. Если нет, то вам нужно вернуться к нашим первоначальным комментариям об использовании инструментов и посмотреть, есть ли какие-либо утечки или, если нет, хотя бы посмотреть, что потребляет вашу оперативную память. Вы уже искали утечки / распределения? Что ты нашел?
@Desmond, вы можете либо (а) передать его как свойство в prepareForSegue, (б) сохранить его как свойство одноэлементного класса, либо (в) сохранить его как свойство делегата приложения, которое вы получите с помощью [UIApplication sharedApplication] .delegate. Более того, если вы пытаетесь получить доступ к контроллеру основного представления, но вас беспокоят ваши начальные контроллеры представления, возможно, вы захотите изменить порядок раскадровки так, чтобы контроллер основного представления фактически являлся корневым (который запускается при вам это нужно), таким образом popToRootViewController всегда доставит вас домой.
я связываю пользовательский переход из другого viewcontroller с mainviewcontroller, который вызывает этот файлdl.dropbox.com/u/418769/popToMain.m который, в свою очередь, вернется к mainviewcontrol, это правильный путь в раскадровке? Desmond
3

зировать и решить все проблемы. Запустите ваше приложение под инструментами Утечки и Распределения.Используйте анализ кучи.

спасибо @Ken thomases, я посмотрю Desmond

Похожие вопросы