这很奇怪..在我复制目标以制作我的应用程序的付费版本之前我的应用程序运行良好。当我想要显示UIViewController时,它被加载并显示,但我的应用程序崩溃了,并且给了我设备日志中出现此错误:
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x341c2fbc objc_msgSend + 16
1 UIKit 0x3735fdfe -[UINavigationController topViewController] + 46
2 UIKit 0x37395ae4 -[UINavigationController viewDidDisappear:] + 80
3 UIKit 0x373636ae -[UIViewController _setViewAppearState:isAnimating:] + 138
4 UIKit 0x373beaea -[UIViewController _endAppearanceTransition:] + 258
5 UIKit 0x373ecec8 -[UIViewController endAppearanceTransition] + 16
6 UIKit 0x3741cf04 -[UIWindowController transitionViewDidComplete:fromView:toView:] + 1404
7 UIKit 0x373bc934 -[UITransitionView notifyDidCompleteTransition:] + 140
8 UIKit 0x373bc7b8 -[UITransitionView _didCompleteTransition:] + 896
9 UIKit 0x37336814 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 464
10 UIKit 0x3733bfb2 -[UIViewAnimationState animationDidStop:finished:] + 46
11 QuartzCore 0x34a8dba0 CA::Layer::run_animation_callbacks(void*) + 196
12 libdispatch.dylib 0x36bace86 _dispatch_main_queue_callback_4CF$VARIANT$up + 190
13 CoreFoundation 0x33f4b2d6 __CFRunLoopRun + 1262
14 CoreFoundation 0x33ece4d6 CFRunLoopRunSpecific + 294
15 CoreFoundation 0x33ece39e CFRunLoopRunInMode + 98
16 GraphicsServices 0x30752fc6 GSEventRunModal + 150
17 UIKit 0x3734f73c UIApplicationMain + 1084
18 MyApp 0x00002674 main (main.m:15)
19 MyApp 0x00002624 start + 32
我的错误在哪里?任何人都可以帮助我吗?
答案 0 :(得分:1)
这看起来像僵尸对象访问,就在它的脸上。不确定为什么单独复制目标会导致这种情况,但您是否尝试使用模拟器中的Zombies工具分析您的应用程序?
编辑:
烨。好的,现在你知道发生了什么。同样,我很难想象仅仅复制一个目标会导致这种情况发生。应保留的对象不会被保留。造成这种情况的原因有很多,但一个可能的原因是应该声明为retain
或copy
的@property,但声明为assign
。僵尸工具可以帮助你进一步:
在该错误消息旁边,圆圈中应该有一个小箭头。如果单击它,它将带您进入详细视图,该视图向您显示在该生命期间保留和释放该对象的所有内容。这可能会有所帮助,也可能不会。如果问题是某些东西“过度释放”了该对象,您可能能够从列表中判断出来,但更可能的问题是应该保留它的东西不是,并且不会出现在列表中
在该列表中可能有用的是查看谁创建了对象,因为通常这将是对象的逻辑“所有者”(或者它将把它传递给逻辑所有者)。我会完成我的项目,并考虑相关对象的预期所有权。谁应该拥有这个对象?他们为什么不保留它?
如果您还在快速了解Cocoa内存管理,我建议您阅读Apple的指南:Advanced Memory Management Programming Guide修复僵尸对象访问是Objective-C开发人员的成功之道。坚持使用平台,毫无疑问,您将有很多机会磨练自己的技术。
您也可以考虑使用自动参考计数(ARC)。它的目的是让你不必考虑这些东西,实际上非常好用。
编辑2:
刚发生在我身上:您是否有可能在原始目标中使用ARC,当您复制目标时,该设置以某种方式被关闭了?这当然可以解释它。