我遇到了一个非常奇怪的问题。我希望你们中的许多人能够为我提供解决方案。 我的应用程序经常中断,但我无法得到确切的情况。
在Log中我得到以下
2011-02-10 16:22:12.914 RCA-iOS[4132:8327] modifying layer that is being finalized - 0xe43c520
2011-02-10 16:22:13.253 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520
2011-02-10 16:22:13.270 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520
2011-02-10 16:22:13.270 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520
2011-02-10 16:22:13.272 RCA-iOS[4132:207] *** -[CALayer frame]: message sent to deallocated instance 0xe43c520
以下是我的Stack Trace。它打破主线程
#0 0x01978057 in ___forwarding___
#1 0x01a07b42 in __forwarding_prep_1___
#2 0x003c196a in -[UIView(Geometry) frame]
#3 0x003f5ff4 in -[UINavigationBar _getTitleViewFrame:leftViewFrame:rightViewFrame:forViews:forItemAtIndex:]
#4 0x003e5cab in -[UINavigationBar _getTitleViewFrame:leftViewFrame:rightViewFrame:forViews:]
#5 0x003f0c06 in __-[UINavigationBar layoutSubviews]_block_invoke_1
#6 0x003bdb5c in +[UIView(Animation) _performWithoutAnimation:]
#7 0x003f76bb in -[UINavigationBar layoutSubviews]
#8 0x00f59451 in -[CALayer layoutSublayers]
#9 0x00f5917c in CALayerLayoutIfNeeded
#10 0x00f5237c in CA::Context::commit_transaction
#11 0x00f520d0 in CA::Transaction::commit
#12 0x00f827d5 in CA::Transaction::observer_callback
#13 0x019e7fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
#14 0x0197d0e7 in __CFRunLoopDoObservers
#15 0x01945bd7 in __CFRunLoopRun
#16 0x01945240 in CFRunLoopRunSpecific
#17 0x01945161 in CFRunLoopRunInMode
#18 0x02129268 in GSEventRunModal
#19 0x0212932d in GSEventRun
#20 0x0039e42e in UIApplicationMain
#21 0x00001fd0 in main at main.m:14
以下是NSZombie对象的Instrument`s输出。这指向UIKit
# Category Event Type RefCt Timestamp Address Size Responsible Library Responsible Caller
0 CALayer Malloc 1 25304068864 0x10837840 48 UIKit -[UIView _createLayerWithFrame:]
1 CALayer Zombie -1 99780847872 0x10837840 0 UIKit -[UIView(Geometry) frame]
没有任何指向代码。有谁遇到过这种问题?如果是,请让我知道以下
1)当我们得到“修改正在最终确定的层”时破坏问题?
2)是由于UIView层?例如(view.layer.cornerRadius)?
3)Stack Trace指向UINAvigationBar,有没有办法覆盖方法并试用一些东西?
任何帮助表示赞赏。谢谢
答案 0 :(得分:40)
当您尝试在正在解除分配的过程中修改CALayer的属性时,会发生错误"modifying layer that is being finalized"
。我已经看到这种情况发生了,当我在该层的-dealloc
方法中意外地使用访问器清除CALayer上的属性时。
如果更新任何与显示相关的内容(因此触及底层CALayer),这也可能在UIView的-dealloc
方法中发生。
在你的情况下,由于僵尸消息,你似乎在某处过度释放了UIView。 "modifying layer that is being finalized"
只是副作用,因为在某些时候你会在它应该被解除分配之前更新UIView。
打开断点,确保在抛出异常时设置断点,并在调试器中运行应用程序。它应该停止在消息被发送到过度发布的UIView的行上,该UIView应该告诉你哪个视图位于其中心。然后,您可以回溯以查找您发送过多释放消息的时间点(或者如果您需要超出当前范围,则自动释放而不保留。)
因为您已经有指向UINavigationBar的证据,请检查它及其相关视图,以确保您正确保留它。
答案 1 :(得分:2)
我在意外尝试释放一个不应该被释放的对象时遇到此错误,并将其与UIView动画块一起使用。修复使问题消失。
答案 2 :(得分:0)
@ MegaMind-我也遇到了这个问题“修改正在最终确定的层”导致应用退出但我能够解决这个问题。我认为你正在释放出现UIView时被调用的任何对象。
答案 3 :(得分:0)
当我发布一个从未调用过alloc的对象时,我遇到了这个错误,所以可能就是这样。
答案 4 :(得分:0)
帮助那些看不出任何错误的新手(像我一样)。 MGMT,
我也遇到了这个错误,因为我错误地在IBOutlet属性上使用了'assign',它应该在其上有一个'retain'。 复制粘贴时要小心!
答案 5 :(得分:0)
点击UIButton时出现此错误。有趣的是,UI按钮没有任何问题,但实际上是按钮下方的一个子视图。我找到了一个子视图,其中包含了额外的版本。