[iOS] AppDelegate.swift

XcodeでiOSのプロジェクトを生成すると、自動で生成されるいくつかのファイルがあります。
その中でもAppDelegate.swiftというファイルの中身を覗いてみると、すごく重要な内容が書かれている感じがします。
今回はAppDelegate.swiftがどのような役割をするのか調べてみたいと思います。

AppDelegate.swiftの中にはAppDelegateクラスが存在し、このクラスはみなさんが作るアプリの中心的な役割をします。
AppDelegate.swiftの役割は大きく2つがあります。

1. ウィンドウの生成と状態変化のレスポンスを返す

みなさんのアプリが描かれるウィンドウを生成し、
アプリ内の状態(ステータス)変化に反応できるようにします。
状態変化の例としてはアプリの実行、バックグラウンドへの切り替え終了などが挙げられます。

関連メソッドは以下の通りです。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
func applicationWillResignActive(_ application: UIApplication)
func applicationDidEnterBackground(_ application: UIApplication)
func applicationWillEnterForeground(_ application: UIApplication)
func applicationDidBecomeActive(_ application: UIApplication)
func applicationWillTerminate(_ application: UIApplication)

2. entry pointとアプリの入力イベントを受け渡すrun loopを生成

アプリのentry pointを生成し、ループしながらアプリに入力イベントを渡します。この処理はファイルの頭に書いてあるUIApplicationMainという属性によって行われます。

import UIKit

@UIApplicationMain <- これです
class AppDelegate: UIResponder, UIApplicationDelegate {

 var window: UIWindow?
 ...
}

@UIApplicationMainの中身

#import
#import "AppDelegate.h"

int main(int argc, char *argv[]) {
 @autoreleasepool {
   return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
 }
}

上記のコードによってAppDelegate.swiftでは@UIApplicationMainのみ書くことでUIApplicationMainメソッドを呼び出すことができます。
また、この中でAppDelegateクラス名を指定しているので、アプリ起動時にAppDelegate.swiftが実行されるようになります。

このような流れになると、システムはapplication objectを生成します。
このオブジェクトの役割はアプリの全体的なライフサイクルを管理することです。
その後、システムはAppDelegateクラスのインスタンスを生成してapplication objectに割当し、アプリを実行します。

UIApplicationDelegateプロトコル

基本的にAppDelegateクラスはUIApplicationDelegateプロトコルを採用します。
また、このプロトコルが提供するメソッドを使うことでアプリのステータス変化やapp-levelのイベントの処理が行われます。

windowプロパティ

AppDelegateクラスはwindowというアプリケーションウィンドウのプロパティを持っています。

var window: UIWindow?

このウィンドウはアプリケのビュー階層のルーツになり、アプリのコンテンツ(UIなど)がこの上に描かれます。

最後に

ざっくりですがAppDelegate.swiftの役割について調べてみました。
私も全ての内容を完全理解している訳ではないのですが、
AppDelegate.swiftがアプリの実行に当たってものすごく重要な役割をしていて、下層との関係も思ったより絡まっていることがわかりました。
なので、開発しながらこのファイルにコードを作成する際にはより慎重にすべきだと思いました。

この記事がお読みになるみなさんに参考になると幸いです。
以上です。ありがとうございました🤗

参考


この記事が気に入ったらサポートをしてみませんか?