[CALayer retain]: сообщение отправлено освобожденному экземпляру? - PullRequest
3 голосов
/ 13 февраля 2012

В моем приложении, когда я переключаю представления, примерно после 4-го раза, когда я переключаю представления, я получаю сбой, который говорит:

*** -[CALayer retain]: message sent to deallocated instance 0x6c4ba0

У меня есть NSZombieEnabled в XCode, и он указывает мне на эту строку всякий раз, когда онпереключает представления:

[self.view removeFromSuperview];

Также, если я делаю обратную трассировку (gdb), это дает мне следующее:

#0  0x37dd68a0 in ___forwarding___ ()
#1  0x37d31680 in __forwarding_prep_0___ ()
#2  0x37d1d026 in CFRetain ()
#3  0x37d26bb2 in +[__NSArrayI __new::] ()
#4  0x37d26acc in -[__NSPlaceholderArray initWithObjects:count:] ()
#5  0x3518e680 in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] ()
#6  0x3518e7a4 in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] ()
#7  0x3534c40c in __UIViewWillBeRemovedFromSuperview ()
#8  0x3518dad0 in -[UIView(Hierarchy) removeFromSuperview] ()
#9  0x000368a6 in __block_global_1 (.block_descriptor=<value temporarily unavailable, due to optimizations>, finished=1 '\001') at /Users/bobsComputer/Desktop/Projects/NewApp/MyApp/MyApp3/MyApp3ViewController.mm:135
#10 0x351a70be in -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] ()
#11 0x351a181a in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] ()
#12 0x351a6fb8 in -[UIViewAnimationState animationDidStop:finished:] ()
#13 0x3354fba6 in CA::Layer::run_animation_callbacks ()
#14 0x37a91f7a in _dispatch_main_queue_callback_4CF$VARIANT$mp ()
#15 0x37da72dc in __CFRunLoopRun ()
#16 0x37d2a4dc in CFRunLoopRunSpecific ()
#17 0x37d2a3a4 in CFRunLoopRunInMode ()
#18 0x378a8fcc in GSEventRunModal ()
#19 0x351ba742 in UIApplicationMain ()

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

У кого-нибудь есть идеи, почему происходит сбой?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

-[UIView addSubview:] вызывает сохранение подпредставления, а -[UIView removeFromSuperview] вызывает освобождение представления. Это прямо из документации Apple UIView . В этот момент один из ваших объектов должен сохранить CALayer, иначе он будет освобожден.

Я предположил, что CALayer был создан вами напрямую. Все UIViews связаны с CALayers; CALayer - это то, во что втягивается UIView, а затем его CALayer накладывается на экран. Если вы не работаете с CALayers напрямую, это является признаком другой проблемы.

Основная проблема, которую вы описываете, это перевыпуск. Возможно, вы не сохраняете UIView, когда должны. Я предлагаю вам запустить анализатор Xcode (в Xcode 4 выберите пункт меню Product> Analyze) и посмотреть, что сообщается. Обратите особое внимание на все ошибки управления памятью, которые он сообщает.

1 голос
/ 09 ноября 2012

У меня была такая же проблема. Я не использовал Interface Builder для своих представлений. Причина состояла в том, что подпредставление представления, которое вызывало сбой, было выпущено дважды (но не вылетало при втором выпуске достаточно странно). Поэтому я бы посоветовал вам перейти к методу initWithFrame представления или к тому месту, куда вы добавляете свои подпредставления, и внимательно просматривать каждый выпуск. Я обычно не реализую метод dealloc, так как я отправляю сообщение autorelease каждому подпредставлению, прежде чем добавить его в родительское представление. Таким образом, у меня меньше мест для просмотра, и я уверен, что все будет освобождено, как только родительское представление будет отброшено. Надеюсь, это поможет ...

...