1

iPhone アプリの起動が非常に遅く、その理由がわかりません。私application:didFinishLaunchingWithOptions:はそれほど重くはありません。タブ バー コントローラーの 5 つのビュー コントローラーのそれぞれに 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

mathRootViewController などを設定するために、起動時に読み取られて解析される非常に大きな初期 xib ファイルがあるようです。

コントローラーが必要になるまで待ってからロードしてみてください。つまり、コントローラーを別の xib ファイルに入れて、このようなメソッドを追加してください。

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

コントローラを使用するたびに、 を使用するだけでなくmathRootViewController ;[self mathRootViewController ]代わりに使用してください。このパターンは、View Controller を作成する必要が初めて必要になるまで待機します。

于 2010-10-10T00:15:27.863 に答える
2

では、上記のコードが遅いと思いますか? つまり、 didFinishLaunchingWithOptions がいつ入力され、いつ戻るかを確認するために NSLog 呼び出しを追加しましたか? 上記のいくつかの行の間にいくつかの NSLog を追加するだけで、スタックしている場所がすぐにわかりますね。

また、init... 関数が最初に呼び出され、他のファイルでも +initialize されることに注意してください。そこに NSLogs を追加して、didFinishLaunchingWithOptions の前に呼び出されるかどうかを確認し、それらのいずれかが時間を無駄にしているかどうかを確認します。

于 2010-12-19T23:05:24.780 に答える
2

Xcode を使用して iPhone でアプリを実行していますか? そのように実行すると、アプリの起動が非常に遅くなる傾向があります。Xcode を使用せずに、iPhone 自体でアプリを起動してみてください。

于 2010-10-09T21:08:22.160 に答える
2

最初に、これが実際に遅い関数であるというあなたの仮定を確認します - プロファイラー - Instruments - CPU Sampler - を使用して、関数が示すタイミング情報を確認し、他の何かが物事を遅くしている可能性があるため、それを他のものと比較します。

仮定を確認し、さらに詳細が必要な場合は、「mach_absolute_time」を使用して非常に細かいタイミングを追加できます。最後に NSlog で時差を報告します。パフォーマンスも低下する可能性があるため、あまり多くのログを記録しないでください。

于 2010-10-09T22:14:14.770 に答える
0

時間がかかる処理を行っている場合は、新しいスレッドを生成し、バックグラウンド スレッドでこの作業を行います。

于 2010-10-09T21:10:17.570 に答える
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 に答える
0

managedObjectContext 全体を使用せずにアプリを試して、起動が速くなるかどうかを確認してください。その場合は、必要なビューが開いたときにのみ managedObjectContext を設定します。開始時刻が同じままである場合は、nib ファイルに問題があるはずです。

于 2010-12-19T11:46:27.540 に答える