[CALayer retain]:发送到解除分配的实例的消息?

时间:2012-02-12 20:34:08

标签: ios cocos2d-iphone views transition

在我的应用程序中,当我切换视图时,大约第四次切换视图后,我得到一个崩溃说:

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

我在Xcode中有NSZombieEnabled,每次切换视图时都会指向此行:

[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 个答案:

答案 0 :(得分:4)

-[UIView addSubview:]会导致子视图保留,-[UIView removeFromSuperview]会导致视图被释放。这是直接来自Apple's UIView documentation。此时,您的一个对象需要保留CALayer,否则它将被解除分配。

我认为CALayer是由你直接创建的。所有UIViews都与CALayers相关联; CALayer是UIView所吸引的,然后它的CALayer被合成到屏幕上。如果您没有直接使用CALayers,这是另一个问题的症状。

您所描述的核心问题是过度发布。你有可能在你应该的时候没有保留UIView。我建议您运行Xcode分析器(在Xcode 4中,选择Product&gt; Analyze)菜单项并查看报告的内容。请特别注意它报告的所有内存管理错误。

答案 1 :(得分:1)

我遇到了同样的问题。我没有使用Interface Builder来查看我的视图。原因是导致崩溃的视图的子视图被释放了两次(但在第二次发布时没有崩溃)。所以我建议你进入视图的initWithFrame方法,或者你在哪里添加子视图并仔细查看每个版本。我通常不实现dealloc方法,因为我在将其添加到父视图之前向每个子视图发送自动释放消息。通过这种方式,我可以查看更少的地方,并确保一旦父视图被丢弃,所有内容都将被释放。希望有所帮助...