:发送到释放实例的消息?

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

*** -[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 () 

另外这个如何切换视图,我有一个主视图控制器。 然后,我使用父视图和协议从我的其他视图控制器调用这些方法。 然后我使用自定义的UIViewanimation来切换视图。

有没有人有任何想法,为什么这是崩溃?

谢谢!

-[UIView addSubview:]导致子视图被保留, -[UIView removeFromSuperview]导致视图被释放。 这是从苹果的UIView文件直接。 此时,您的一个对象需要保留CALayer,否则它将被释放。

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

您所描述的核心问题是过度销售。 当你应该的时候,你可能没有保留UIView。 我build议你运行Xcode分析器(在Xcode 4中,selectProduct> Analyze)菜单项,看看有什么报告。 要特别注意它报告的所有内存pipe理错误。

我有同样的问题。 我没有为我的视图使用Interface Builder。 原因是导致崩溃的视图的子视图被释放了两次(但没有崩溃在第二次发布奇怪地足够)。 所以我build议你进入视图的initWithFrame方法,或者无论你在哪里添加你的子视图,仔细看看每一个版本。 我通常不实施dealloc方法,因为我发送autorelease消息到每个子视图,然后将其添加到父视图。 通过这种方式我有更less的地方看,我敢肯定,一旦父视图被丢弃,一切都将被释放。 希望有帮助…