【问题标题】:My iPhone app crashes on Load before AppDelegate finishes Loading在 AppDelegate 完成加载之前,我的 iPhone 应用程序在加载时崩溃
【发布时间】:2012-04-10 11:38:56
【问题描述】:

所以我有一个很棒的应用程序,它可以在模拟器上完美运行,或者在设备插入时运行。

然后,如果我创建 IPA 并将其部署在我的设备上,或者使用 TestFlight,甚至提交到 App Store。当我尝试启动该应用程序时,该应用程序大部分时间都会崩溃。

即使没有符号化的崩溃报告也不会给我任何信息。

我使用了 TestFlight,以便它可以帮助我找出应用程序崩溃的位置,但应用程序在 TestFlight 启动之前崩溃。

这是我的一些代码(main.m):

#import <UIKit/UIKit.h>
#import "version3contentAppDelegate.h"

int main(int argc, char *argv[]) {

    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([version3contentAppDelegate class]));
    }
}

version3contentAppDelegate.m 的开头:

#import "TestFlight.h"
#import "version3contentAppDelegate.h"
#import "RootTableViewController.h"
#import "AppsFeedTableViewController.h"
#import "AboutShmoopModalViewController.h"

@implementation version3contentAppDelegate

@synthesize window, shmoopCoreData, tabBarController;



#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    NSLog(@"applicationDidFinishLaunching");

    [TestFlight takeOff:@"3f3618576288d96d598646d060a4f26a_NzUyMjEyMDEyLTAzLTI2IDE3OjIxOjQzLjgyNzQwNg"];
...

如您所见,TestFlight 代码位于 didFinishLaunching 的开头。这意味着,如果它在那之后崩溃,我将在 TestFlight 上获得崩溃报告,而我没有。

有人知道为什么会这样吗? 该项目最初是在旧的 xcode 上为旧 iphone 开发的,目前它是一个 xcode 3 项目。但我在 XCode 4.3 和 iOS 5.1 设备上对其进行编程。

【问题讨论】:

  • 在所有异常上设置断点怎么样?
  • 但我不能断点,因为它只有在 Adhoc 上或在 Apple Store 上提交后才会崩溃? (我可能错了)
  • 这毫无意义...部署不会改变代码。你以前是怎么崩溃的(我想我的意思是:你怎么知道它崩溃了)?你能复制它吗?
  • 所以我在应用程序上打补丁,在设备上调试,然后更新代码。我想在某些时候我做错了什么。将其修补到 App Store,并继续我的更新。我没有从 App Store 测试每个版本,但用户开始说它崩溃了。现在我没有旧代码。我可以随心所欲地复制崩溃,它在闪屏加载时崩溃。我短暂地看到了闪屏,然后它就崩溃了。
  • 这根本不具体!发布整个- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions,否则任何人都无能为力。档案不会突然中断。

标签: iphone objective-c ios xcode


【解决方案1】:

如果它在您的设备上崩溃,那么您将看到崩溃日志。

其次,根据我的经验,应用程序崩溃的主要原因:didFinishLaunchingWithOptions: 是由于加载资源的加载时间过长。

iOS 有一个看门狗计时器,它可以监视应用程序,如果它们执行某些操作的时间过长,就会终止它们。加载、卸载等。通常需要几秒钟,如果它们花费的时间比这更长,计时器会杀死它们,假设它们被挂起。

出于调试原因,此计时器在模拟器中被禁用,这就是这些崩溃仅在实际设备测试期间出现的原因。

一旦您从本地设备获得崩溃日志,请检查给定的代码,如果是 0x8badf00d,那么它就是看门狗计时器正在杀死您的应用程序。注意错误代码 8-bad-food :-)

然后您需要查看您的代码并尽可能多地移动到后台线程,以便 didFinishLaunchingWithOptions: 方法可以尽快完成。

【讨论】:

    【解决方案2】:

    这可能是 TestFlight 启动本身的崩溃 - 我刚刚花了很多时间来追踪一个非常相似的问题,其中 AdHoc 测试部署是随机的,有时会在打开时崩溃,特别是 [TestFlight takeOff:...] 行回溯显示它崩溃了。

    从设备中获取崩溃日志(在所有出现在闪屏后崩溃的情况下,我都有崩溃日志),并尝试使用symbolicatecrash 翻译转储 - 在我的情况下,它没有'除了调用 testflight 的 applicationDidFinishLaunching:withOptions 行之外,不翻译任何内容。

    【讨论】:

      【解决方案3】:

      根据您的要求,这是我的评论:

      如果它显示启动画面,它确实会进入 didFinishLaunching。不过,我注意到您没有使用 ARC。会不会是你过度释放了某些东西?重构您的项目,看看是否有帮助

      【讨论】:

        【解决方案4】:

        这是 Xcode 的问题。如果您没有使用自动布局和大小类,则删除启动 xib 文件。 崩溃将得到解决。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多