1

我的 iphone 应用程序启动非常缓慢,我不知道为什么。我application:didFinishLaunchingWithOptions:的并不是很重,我只是为标签栏控制器的五个视图控制器中的每一个设置 managedObjectContext 。

有人知道是什么原因导致启动缓慢吗?谢谢。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    mathRootViewController.managedObjectContext = self.managedObjectContext;
    favoriteRootViewController.managedObjectContext = self.managedObjectContext;
    chemistryRootViewController.managedObjectContext = self.managedObjectContext;
    physicsRootViewController.managedObjectContext = self.managedObjectContext;
    shareRootViewController.managedObjectContext = self.managedObjectContext;

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];


    return YES;
}
4

7 回答 7

7

看起来您有一个非常大的初始 xib 文件,该文件在启动时被读取和解析以填充 mathRootViewController 等。

尝试等到需要控制器后再加载它们,即将它们放在单独的 xib 文件中并添加看起来有点像这样的方法

- (UIViewController *)mathRootViewController {
    if (nil === mathRootViewController) {
        mathViewController = [[MathViewController alloc] initWithNibName:@"MathViewController" bundle:nil];
        [mathViewController setManagedObjectContext:[self managedObjectContext]];
    }
    return mathRootViewController;
}

并且每次你使用控制器时不要只使用mathRootViewController ;[self mathRootViewController ]而是使用 - 这种模式将等到你第一次需要视图控制器来创建它。

于 2010-10-10T00:15:27.863 回答
2

您是否通过 Xcode 在 iPhone 上运行该应用程序?以这种方式运行时,应用程序往往启动非常缓慢。尝试在 iPhone 本身上启动应用程序,而不使用 Xcode。

于 2010-10-09T21:08:22.160 回答
2

首先,我要确认您的假设,即这确实是一个缓慢的函数 - 使用分析器 - 仪器 - CPU 采样器 - 查看该函数显示的时间信息并将其与其他函数进行比较,因为其他东西可能会减慢速度。

一旦您确认了您的假设并且您需要更多详细信息,您可以使用“mach_absolute_time”添加非常精细的时序。最后用 NSlog 报告时间差异。不要做太多的日志记录,因为这也会损害性能。

于 2010-10-09T22:14:14.770 回答
2

那么,您是否只是怀疑上面的代码很慢?即,您是否添加了 NSLog 调用以查看何时输入 didFinishLaunchingWithOptions 以及何时返回?只需在上面几行之间添加一些 NSLog 就会很快告诉你它卡在哪里,你不觉得吗?

另外,请注意 init... 函数首先被调用,并且 +initialize 在其他文件中也是如此。在那里添加 NSLogs 以查看它们是否在 didFinishLaunchingWithOptions 之前被调用以发现它们中的任何一个是否浪费时间。

于 2010-12-19T23:05:24.780 回答
0

如果它正在执行任何需要一段时间的处理,则生成一个新线程并在后台线程上执行此工作。

于 2010-10-09T21:10:17.570 回答
0

尝试不使用整个 managedObjectContext 的应用程序,看看它是否启动得更快。如果是这样,则仅在您需要的视图打开时才设置 managedObjectContext。如果开始时间保持不变,那么它应该与您的 nib 文件有关。

于 2010-12-19T11:46:27.540 回答
0

DYLD_PRINT_STATISTICS在应用程序慢速目标的运行阶段将环境变量设置为启动应用程序,1以打印出启动过程中的慢速内容。打印出来的样子如下:

    Total pre-main time: 2.2 seconds (100.0%)
     dylib loading time: 1.4 seconds (64.5%)
    rebase/binding time: 205.99 milliseconds (9.2%)
        ObjC setup time:  84.90 milliseconds (3.8%)
       initializer time: 496.64 milliseconds (22.3%)
       slowest intializers :
         libSystem.B.dylib :  21.82 milliseconds (0.9%)
      libglInterpose.dylib : 156.49 milliseconds (7.0%)
     libMTLInterpose.dylib :  47.01 milliseconds (2.1%)
                   AppName : 224.40 milliseconds (10.0%)

Apple 推荐 400 毫秒。

资料来源:用你的面包

于 2016-10-27T22:47:10.787 回答