2012-12-10 2 views
0

Итак, после долгих размышлений и немного разочарований в трате времени, пытаясь найти проблемы с управлением памятью, я провел некоторое исследование и, наконец, поддался переходу на ARC. И это было относительно безболезненно. Однако появилась новая проблема с моими UIViewControllers, Pre-arc все они работали, как рекламировались, я толкнул их в стек, они появились, я вытащил их из стека, их метод dealloc был вызван, и все были счастливы. Переходя к ARC, ни один dealloc не вызывается. что является неудачным. Поэтому я сделал некоторое исследование проблемы, позвольте мне перечислить, что я делаю и/или не делаюUIViewControllers And ARC

. Во-первых, представление, которое я нажимаю на стек, явно не объявлено сильным.

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

.Turned Off NSzombies, как, по-видимому, что приведет к вещам, чтобы остаться в АРК включено код

й изменил код, в соответствии с Брэдом Ларсонов ответить в Memory not released in ios view hierarchy, от этого

if (_friendsListVC == nil) 
{ 
    _friendsListVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil]; 
    _friendsListVC.delegate = self; 
} 

[self.navigationController pushViewController:_friendsListVC animated:YES]; 

(_friendsListVC является переменной-членом). Для этого

FriendsListViewController *fVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil]; 
//fVC.delegate = self; 
[self.navigationController pushViewController:fVC animated:YES]; 

снова нет радости, dealloc точка останова никогда не получает удар, и дело в том, я толкать и поп много взглядов в мое приложение, так что это приведет лишь к большему количеству проблем с памятью, поверх них я перешел на ARC, надеюсь, исправить ...

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

Я устал, может кто-нибудь разъяснить мне, что делает ARC? или что я не делаю в отношении к использованию ARC? и для будущей ссылки все представления, которые вы хотите использовать для иерархии представлений в ARC, не являются переменными экземпляра?

благодарит заранее.

+0

Вы включены nszobie? –

ответ

3

Я понял, что этот вопрос, но это не исправить другие контроллеры, которые не были dealloc'ed, это были по разным причинам полностью.Таким образом, в интересах распространения знаний и облегчения кто-либо другой из этой боли я собираюсь перечислить количество вещей, которые, возможно, причиной сохранения циклов, в основном относящихся к ARC и UIViewControllers и блоков кода

  1. Не хорошо ссылайтесь на то, что вы нажимаете.

  2. Если класс, на который вы нажимаете на иерархию представления, имеет делегат класса, вызывающий метод push, делает его небезопасной ссылкой, на самом деле было бы хорошей практикой сделать все ваши делегаты небезопасными, если один из моих делегатов был сильный, поскольку я предположил, что конвертер ARC сделает это для меня.

  3. Отключить NSZombies. Не постоянно обращайте внимание на вас, только когда вам нужно убедиться, что операторы dealloc вызывают, когда они должны.

  4. Не ссылайтесь непосредственно на self в кодовых блоках, это вызывает цикл удержания. Если вам нужно использовать self, сделайте следующее за пределами блока (а затем используйте слабый)

    __unretained_unsafe className * weakSelf = self;

  5. Остерегайтесь статическими ссылок, я не уверен в этом, но я был метод, который принял в двух экземплярах контроллеров зрения и толкнул один поверх другие, ссылки были назначены два статических экземплярами из них в этот класс (не спрашивайте почему), после обнуления их после того, как они были использованы, мне показалось, что я исправил свою проблему, я не уверен, почему.

  6. Это еще один, о котором я не уверен, но видел, что он упоминается где-то один или два раза. Если у вас есть блок кода в классе, попробуйте не использовать переменные экземпляра в этом блоке, снова сделайте переменную __unsafe_unretained.

И вот об этом, после проверки большинство из них и фиксируя их все мои взгляды их метод dealloc вызывается, когда толкнул в каждый раз, а не в какой-то странной произвольной точке. Также, чтобы прояснить это, просто краткий контрольный список, чтобы быстро помочь любому, кто сталкивается с теми же проблемами, я не утверждаю, что имею полное понимание некоторых концепций здесь, но я рекомендовал вам, как я надеюсь, успеть.

0

Именно поэтому инструменты существуют. Запустите инструмент «Утечки», и он расскажет вам, что выделяет эти контроллеры представлений (которые вы уже знаете) вместе с тем, что еще я их сохраняю (чего вы не знаете).

Кроме того, вы утверждаете, что существует утечка памяти, но вы не знаете, что до тех пор, пока вы не запустите инструмент ObjectAlloc и не увидите, что использование памяти действительно поднимается с повторным использованием.

+0

Я проверил тест на герметичность, поэтому я был настолько озадачен, что никаких утечек не появилось, хотя dealloc никогда не вызывался. Полагаю, я должен был подробно остановиться на том, что я до сих пор довольно новичок в ARC, и не был уверен, что если ARC заставит ваши инструменты утечки устаревать или какое-то другое странное поведение. Однако, если я выталкиваю представление, то всплываю, No dealloc, но если я нажму тот же вид, а затем поплю его второй раз, альт, у нас есть dealloc, Strange business и никаких утечек, поэтому я полагаю, что я должен быть счастлив. – Genhain

+0

Утечка точно работает с ARC. Однако то, что у вас есть, вероятно, не является утечкой. Что-то еще удерживает этот VC, поэтому вы видите, что он наконец выпускается, когда создается второй экземпляр VC, потому что все, что удерживалось на вашем старом, теперь удерживается на новом. Я бы использовал Object Alloc и heapshot, чтобы попытаться увидеть, что неожиданно удерживает ваш VC. –

0

У меня такая же проблема.

Когда я отключил вариант NSZombie от моего проекта, это сработало для меня. Я не знаю, почему это происходит.

  • Перейти к схемам ProductEdit
  • отключить NSZombie
+0

Как я уже указывал Кендалл выше, я должен нажать и выставить контроллер более одного раза, прежде чем метод dealloc решит, что было бы подходящее время для вызова, спасибо за ввод. – Genhain

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