我继承了一个针对iOS 6编写的iOS应用程序(最后在iOS 7发布之前完成)。
当它最后一次使用时,Xcode(版本4,我猜)能够在iPhone 5模拟器上编译和运行它,等等。
我现在正试图在Xcode 6中恢复它,试图在iPhone 5模拟器上再次运行它(因为它不是为在x64上运行而构建的,这是我可以运行它的最新手机)。
它使用故事板。
我现在的位置是其中一个视图控制器正在重复调用它的viewDidLoad方法。当我在该方法的顶部暂停调试器时,我在下面看到了这个堆栈跟踪。
关于如何进一步调试的任何想法,所以我可以确定它被重复调用的原因?我搜索了所有代码并且没有看到它被明确调用,并且堆栈跟踪(下面)似乎没有提供任何线索。我猜是因为StoryboardMagic®?
更新:相关的viewDidLoad
方法现已减少为只调用[super viewDidLoad];
,但仍然存在此问题。我不确定为什么人们投票决定关闭这个,因为没有给出任何评论。要清楚,堆栈跟踪不是来自崩溃,它是viewDidLoad
方法顶部的跟踪,它不断被重复命中。内存没有增加,程序似乎没有崩溃,所以我认为没有任何递归发生,FWIW。
* thread #1: tid = 0x19e5f8, 0x001305de Company`-[CompanyiPhoneMapViewController viewDidLoad](self=0x7c2ecc00, _cmd=0x02d8ebf4) + 78 at CompanyiPhoneMapViewController.m:519, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
* frame #0: 0x001305de Company`-[CompanyiPhoneMapViewController viewDidLoad](self=0x7c2ecc00, _cmd=0x02d8ebf4) + 78 at CompanyiPhoneMapViewController.m:519
frame #1: 0x025b62a4 UIKit`-[UIViewController loadViewIfRequired] + 771
frame #2: 0x025ec0ed UIKit`-[UINavigationController _layoutViewController:] + 42
frame #3: 0x025ec65c UIKit`-[UINavigationController _updateScrollViewFromViewController:toViewController:] + 235
frame #4: 0x025ec760 UIKit`-[UINavigationController _startTransition:fromViewController:toViewController:] + 90
frame #5: 0x025ed6fb UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 669
frame #6: 0x025ee372 UIKit`-[UINavigationController __viewWillLayoutSubviews] + 57
frame #7: 0x0276204c UIKit`-[UILayoutContainerView layoutSubviews] + 213
frame #8: 0x024e9dd1 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 608
frame #9: 0x03cb1771 libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
frame #10: 0x0201128f QuartzCore`-[CALayer layoutSublayers] + 152
frame #11: 0x02005115 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 397
frame #12: 0x02004f70 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 26
frame #13: 0x01f633c6 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 284
frame #14: 0x01f6478c QuartzCore`CA::Transaction::commit() + 392
frame #15: 0x0202a799 QuartzCore`+[CATransaction flush] + 52
frame #16: 0x02487ceb UIKit`_afterCACommitHandler + 126
frame #17: 0x03f359de CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
frame #18: 0x03f35920 CoreFoundation`__CFRunLoopDoObservers + 400
frame #19: 0x03f2b35a CoreFoundation`__CFRunLoopRun + 1226
frame #20: 0x03f2abcb CoreFoundation`CFRunLoopRunSpecific + 443
frame #21: 0x03f2a9fb CoreFoundation`CFRunLoopRunInMode + 123
frame #22: 0x04cd424f GraphicsServices`GSEventRunModal + 192
frame #23: 0x04cd408c GraphicsServices`GSEventRun + 104
frame #24: 0x0245e8b6 UIKit`UIApplicationMain + 1526
frame #25: 0x000b63dd Company`main(argc=1, argv=0xbff4b4c0) + 141 at main.m:16
frame #26: 0x0477aac9 libdyld.dylib`start + 1
答案 0 :(得分:0)
我仍然没有弄清楚究竟是什么触发了这种反复加载,但我确实找到了一种帮助我解决这个问题的调试技术。
通过检查来自this debugging technique的输出,我能够看到其他方法被重复调用(仍然原因不明),最终导致我修复了一段错误的代码......最终停止了在上面的类中重复调用viewDidLoad。
我不打算将此作为一个答案,因为有人可能知道一些更好的技术来真正识别罪魁祸首。
如果有人知道如何让仪器以可以获得“最常被称为方法”的排序列表的方式对事物进行分析,这可能是追踪类似问题的另一种间接方式。