2012-02-12 2 views
3

В мое приложение, когда я переключение точки зрения, после того, как около 4-ый раз я переключаюсь взгляды я получаю сбой, который говорит:[CALayer сохранить]: сообщение отправлено на освобожденный экземпляр?

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

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

[self.view removeFromSuperview]; 

Кроме того, если я трассировку из (БГД) это дает мне это:

#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 для переключения представлений.

Есть ли у кого-нибудь идеи, почему это сбой?

Спасибо!

ответ

4

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

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

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

+0

Что такое CALayer, хотя это означает UIView? Если да, то что вы имеете в виду, например [[view1 addSubview: view2] сохранить]; ? –

+0

Анализ ничего не сообщает :( –

+0

Можете ли вы использовать отладчик для определения делегата CALayer? Делегат будет объектом (часто UIView), который сообщает CALayer, когда рисовать. У меня не было проблемы, например это сам, но в отладчике вы бы сделали что-то вроде «po [(CALayer *) 0x6c4ba0 delegate]» (это использует адрес из приведенного выше примера). Возможно, если вы определите, какой объект является делегатом CALayer, это в конечном итоге укажет на источник проблемы. – bneely

1

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

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