gpt4 book ai didi

ios - [CALayer 保留] : message sent to deallocated instance?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:58 25 4
gpt4 key购买 nike

在我的应用程序中,当我切换 View 时,大约在第 4 次切换 View 后,我遇到了一个崩溃消息:

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

我在 Xcode 中启用了 NSZombieEnabled,它会在切换 View 时将我指向这一行:

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

这也是我切换 View 的方式,我有一个主视图 Controller 。然后我使用 ParentView 和协议(protocol)从我的其他 View Controller 调用这些方法。然后我使用自定义 UIView 动画来切换 View 。

有人知道为什么会崩溃吗?

谢谢!

最佳答案

-[UIView addSubview:] 导致 subview 被保留,-[UIView removeFromSuperview] 导致 View 被释放。这是直接来自Apple's UIView documentation .那时,您的一个对象需要保留 CALayer,否则它将被释放。

我假设 CALayer 是您直接创建的。所有 UIViews 都与 CALayers 关联; CALayer 是 UIView 绘制的内容,然后它的 CALayer 被合成到屏幕上。如果您不直接使用 CALayers,这是另一个问题的征兆。

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

关于ios - [CALayer 保留] : message sent to deallocated instance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9252429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com