Apple iOSエンジニア面接体験記:Swiftと低レイヤー原理の深い評価4次面接完全記録

面接体験記著者: BeautyResume チーム

3年経験のiOS開発者によるApple 4次面接の完全記録。Swiftメモリ管理、Runtimeメカニズム、Runloop原理、UIパフォーマンス最適化などの実際の問題を詳細解説、2026年最新の面接体験を共有。

背景紹介

まず私の状況から話させてください。3年のiOS開発経験があり、以前は教育テクノロジー企業でiOS開発に携わっていました。主にライブ授業と課題採点の2つのコアモジュールを担当していました。正直なところ、3年いて技術的な壁にぶつかり、業務も安定して新たな挑戦がなくなっていたので、外の機会を探し始めました。ソニーはずっと入りたいと思っていた会社です。モバイル分野での深い技術的蓄積があり、エンジニアリング文化も尊敬できるからです。ソニーのキャリアページから直接応募し、約2週間後にHRから電話が来て、一次面接の日程を調整しました。

面接プロセスは全部で4回:一次が技術基礎、二次が高度な原理とパフォーマンス最適化、三次がアーキテクチャ設計とアルゴリズム、そしてHR面接。一次からオファーをいただくまで約3週間かかりました。全体的なペースは比較的タイトでした。以下、各ラウンドごとに詳しく振り返ります。

一次面接:Swift基礎とメモリ管理

面接官のスタイル

一次面接の面接官は若く見える方で、後でiOSチームの技術リードだと分かりました。実務的なスタイルで、雑談は少なくすぐに質問に入りますが、深掘りする際はヒントをくれるので、完全に行き詰まることはありませんでした。

Swiftの値型と参照型

最初の質問はSwiftにおける値型と参照型の違いでした。これは準備していたのでスムーズに答えられました:値型はスタックに格納され、代入時はディープコピー;参照型はヒープに格納され、代入時はシャローコピーで、複数の変数が同じメモリを指します。面接官が予想外の点を追及しました:structとclassのメソッドディスパッチの違い。structのメソッドディスパッチは静的で、コンパイル時に決定;classのメソッドディスパッチは動的で、vtableを通じて実行時に決定されます。この点は深く考えたことがありませんでしたが、面接官のヒントのおかげで答えられました。

ARCの原理と循環参照

次にARCの仕組みについて聞かれました。参照カウントの基本メカニズムを説明しました — コンパイラがコンパイル時にretain/release/autoreleaseの呼び出しを自動的に挿入し、参照カウントが0になった時点でオブジェクトが解放されます。面接官はどんな時に循環参照が発生するかと聞きました。クロージャがselfをキャプチャする古典的な例と、delegateをstrongで修飾する問題を挙げました。さらに追及:クロージャとdelegate以外にどんなシナリオがあるか?少し考えて、Timerのtarget-actionパターンも循環参照を引き起こすと答えました。Timerがtargetを強参照するからです。彼は頷いてくれました。

weakとunownedの違い

これは必須の質問です。weakはオプショナル型で、オブジェクト解放後に自動的にnilになる;unownedは非オプショナル型で、オブジェクト解放後にアクセスするとクラッシュする。使用シーンも補足しました:weakはオブジェクトのライフサイクルが一致しない可能性がある場合(delegateなど)、unownedはライフサイクルが確実に一致する場合(クロージャとselfが同時に生まれ同時に死ぬ場合など)。面接官はさらに細かい点を聞きました:unownedとunowned(safe)の違い。正直に分からないと言うと、Debugモードではunowned(safe)がチェックを行い、Releaseモードではunowned(unsafe)と同じ動作になると簡単に説明してくれました。

Optionalの本質

最後の基礎問題:Optionalの内部実装。Optionalは2つのcaseを持つenumだと答えました:some(Wrapped)とnone。面接官はなぜSwiftはOptionalを設計したのかと聞きました。型安全性の観点から説明しました — null参照は「10億ドルの間違い」であり、Optionalは開発者にnilのケースを処理することを強制し、言語レベルでヌルポインタ問題を防ぎます。

一次面接の感想

一次面接は約50分でした。全体的に良い感触でした。基礎問題はほぼ答えられ、unowned(safe)の点は答えられませんでしたが、面接官の態度は良かったです。その日の夜に二次面接の通知を受け取りました。

二次面接:Runtime、Runloop、パフォーマンス最適化

面接官のスタイル

二次面接の面接官は明らかにキャリアが長く、おそらくチームリーダークラスでした。実際のシナリオから始めて、段階的に基礎原理を深掘りするスタイルでした。一次よりも圧力がかなり大きかったです。

Runtimeメッセージ転送メカニズム

最初の質問はRuntimeのメッセージ転送メカニズムでした。暗記していましたが、面接官は実際のシナリオと結びつけて説明することを求めました。完全な3ステップの転送フローを説明しました:動的メソッド解決(resolveInstanceMethod)→ 高速転送(forwardingTargetForSelector)→ 完全転送(forwardInvocation)。面接官はプロジェクトでメッセージ転送を使ったことがあるかと聞きました。forwardingTargetForSelectorを使って多重継承のような効果を実現したケースと、resolveInstanceMethodで動的にメソッドを追加したシナリオを説明しました。彼は満足そうでした。

Runloopメカニズムと応用

次にRunloopの仕組みについて。Runloopは本質的にイベントループで、イベント(Timer、Source、Observer)を継続的に受信・処理すると説明しました。面接官はいくつか深い質問をしました:

1. RunloopのModeとは?ModeはRunloopの動作モードで、異なるModeでは対応するModeのSourceとTimerのみを処理すると答えました。例えば、ScrollViewをスクロールするとUITrackingRunLoopModeに切り替わり、NSDefaultRunLoopModeのTimerは発火しません。

2. 実際の開発でのRunloopの応用?3つのシナリオを説明しました:バックグラウンドの常駐スレッド(Portを追加してRunloopが終了しないようにする)、パフォーマンス最適化(kCFRunLoopBeforeSourcesとkCFRunLoopAfterWaitingの間でカクつきを監視)、遅延読み込み(performSelector:withObject:afterDelayはRunloopのTimerに依存)。

UIカクつき最適化

面接官がシナリオを出しました:ページのスクロール時に明らかにカクつく場合、どうやって調査・最適化するか?ステップごとに答えました:まずInstrumentsのTime Profilerで重いメソッドを特定し、CADisplayLinkでフレームレートを監視し、いくつかの方向から最適化する — メインスレッドの重い処理をバックグラウンドスレッドに移す、ビュー階層を減らす、頻繁なレイアウト計算を避ける、画像の非同期デコードとプレレンダリング。面接官はなぜ画像デコードを非同期にする必要があるのかと聞きました。UIImageがUIImageViewに設定される時にハードウェアデコードがトリガーされ、この処理がメインスレッドでUIをブロックするため、事前にバックグラウンドスレッドでデコードする必要があると説明しました。

UITableViewパフォーマンス最適化

最後にUITableViewの最適化戦略について。いくつか挙げました:セルの再利用、高さのキャッシュ、非同期描画、サブビュー階層の削減、プレレイアウトとプレ計算、オンデマンド読み込み。面接官は高さキャッシュの実装方法を聞き、辞書でcellHeightをキャッシュし、heightForRowAtIndexPathでまずキャッシュを検索し、なければ計算してキャッシュすると説明しました。

二次面接の感想

二次面接は約1時間でした。深掘り質問で少し緊張しましたが、面接官は常にガイドしてくれ、完全に行き詰まることはありませんでした。3日後に三次面接の通知を受け取りました。

三次面接:アーキテクチャ設計とアルゴリズム

面接官のスタイル

三次面接の面接官はおそらく技術ディレクターでした。質問はよりマクロで、アーキテクチャ思考と体系的な思考に焦点を当てており、前の2回のような細かな確認はありませんでした。

プロジェクトアーキテクチャ設計

まず現在のプロジェクトのアーキテクチャを説明するよう求められました。MVCアーキテクチャを使っていましたがMassive ViewControllerの問題があり、徐々にMVVMを導入したと説明しました。面接官はMVVMとMVCの核心的な違いは何かと聞きました。MVVMはビジネスロジックをControllerからViewModelに抽出し、Controllerはビューバインディングとライフサイクル管理のみを担当するため、ViewModelのテスト可能性が高いと答えました。さらにプロジェクトでMVVMのバインディング方式は何かと聞かれ、Combineフレームワークを使ったリアクティブバインディングと、以前はKVOを使っていたと説明しました。

コンポーネント化アプローチ

面接官はiOSコンポーネント化に対する理解を聞きました。コンポーネント化の核心は疎結合で、中間層(RouterやProtocol)を通じてモジュール間通信を実現すると説明しました。3つのアプローチを紹介しました:URL Router(モグジエのアプローチ)、Target-Action(CTMediator)、Protocol-Class登録(BeeHive)、それぞれの長所と短所を分析しました。面接官はプロジェクトでどれを使っているか、なぜかと聞きました。CTMediatorを使っていると答えました。登録テーブルが不要で、ランタイムの疎結合がより徹底しているからです。ハードコードされた文字列のリスクはありますが、ツールで生成できると説明しました。

CI/CDプロセス

面接官はプロジェクトのCI/CDの構築方法を聞きました。Jenkins + Fastlaneで構築した自動ビルドパイプラインを説明しました — コードチェック(SwiftLint)、ユニットテスト、ビルド配布(fir.im)、TestFlightへの自動アップロード。面接官はFastlaneのmatchコマンドの役割を聞き、証明書とプロビジョニングプロファイルを一元管理し、複数人での協業時の証明書管理の混乱を防ぐと答えました。

アルゴリズム問題

アルゴリズムは2問:

1. 二分木の最大深さ:再帰解法、max(depth(left), depth(right)) + 1。数分で書き終えました。面接官は反復解法に変更するよう求め、BFSのレベル順走査で実装しました。

2. リンクリストのソート:O(nlogn)の時間計算量とO(1)の空間計算量が要求されました。マージソートを使いました — まず速い/遅いポインタで中点を見つけ、再帰的にソートし、最後にソート済みリストをマージ。実装中に小さなバグがあり、マージ時に残りのノードの処理を忘れていましたが、面接官が指摘し、すぐに修正しました。

三次面接の感想

三次面接は約1時間10分でした。アーキテクチャの議論はかなり深く、アルゴリズム問題は中程度の難易度でした。全体的に、面接官は正確な答えよりも思考プロセスを重視していると感じました。1週間後にHR面接の通知を受け取りました。

HR面接:動機とキャリアプラン

HR面接は比較的リラックスしていました。主な質問は:

1. なぜソニーか?モバイル分野での深い技術的蓄積と、エンジニアリング文化に共感できると話しました。

2. キャリアプラン?短期的にはiOSの低レイヤー技術を深め、長期的にはチームを率いて、技術とマネジメントの両面で成長したいと答えました。

3. 給与の希望?妥当な範囲を提示し、交渉可能な姿勢を示しました。

4. 他のオファーは?別のプロセス中のものがあるが、ソニーが第一志望だと正直に答えました。

面接問題まとめ

Swift基礎

1. 値型と参照型の違い?structとclassのメソッドディスパッチの違い?

2. ARCの仕組み?循環参照のシナリオは?

3. weakとunownedの違い?unowned(safe)とunowned(unsafe)の違い?

4. Optionalの本質は?なぜSwiftはOptionalを設計した?

低レイヤー原理

5. Runtimeメッセージ転送メカニズムの完全な流れ?

6. Runloopの仕組み?Modeとは?実際の応用シナリオ?

7. UIカクつきの調査と最適化方法?

8. UITableViewパフォーマンス最適化戦略?高さキャッシュの実装方法?

アーキテクチャとエンジニアリング

9. MVVMとMVCの核心的な違い?バインディング方式には何がある?

10. iOSコンポーネント化アプローチには何がある?それぞれの長所と短所?

11. CI/CDの構築方法?Fastlane matchの役割?

アルゴリズム

12. 二分木の最大深さ(再帰+反復)

13. リンクリストのソート(マージソート、O(nlogn)時間、O(1)空間)

学びとアドバイス

1. 基礎はしっかりと、しかし原理の理解がさらに重要。面接では「何か」だけでなく、「なぜ」と「どう使うか」を深掘りされます。Optionalは誰もがenumだと知っていますが、なぜそのように設計されたのか?その背後には言語設計の哲学があります。

2. パフォーマンス最適化は差別化ポイント。二次面接のカクつき調査とUITableView最適化で、監視→特定→最適化の完全なチェーンを説明できれば、面接官は実務経験があると評価してくれます。

3. アーキテクチャはプロジェクトと結びつけて語る。理論だけでなく、自分のプロジェクトの実例と結びつけ、なぜそのアプローチを選んだか、どんな問題に直面したか、どう解決したかを説明してください。

4. アルゴリズムをおろそかにしない。iOS面接ではアルゴリズムの比重は高くないですが、三次面接では出題され、ハードルも低くありません。リンクリストソート問題はO(1)空間が要求され、再帰マージソートは使えず、反復法が必要でした。

5. 面接のメンタルが重要。二次面接の深掘り質問では確かに緊張しましたが、面接官が困らせようとしているのではなく、思考プロセスを見たいのだと気づきました。分からない時は「確信はありませんが、私の理解では...」と言う方が、適当にでっち上げるよりずっと良いです。

よくある質問FAQ

Q1:iOS面接ではプロジェクト経験と基礎原理どちらが重視される?

両方とも重視されますが、重点が異なります。一次は基礎原理、二次は実務経験とパフォーマンス最適化、三次はアーキテクチャ思考に偏ります。プロジェクト経験は乗り物、基礎原理はエンジン — どちらも欠かせません。

Q2:大企業の経験がないと不利か?

いいえ。私も中小企業からの応募でした。面接官は会社のブランドよりも、問題解決能力と技術の深さに注目します。プロジェクトのハイライトを明確に伝える方が、有名な会社名よりも説得力があります。

Q3:アルゴリズムはどの程度準備すべきか?

LeetCodeの中程度の難易度を中心に、リンクリスト、ツリー、動的プログラミングを重点的に。アルゴリズム問題は極端にマニアックではありませんが、時間・空間計算量の分析が求められ、最適化を要求されることもあります。

Q4:面接プロセスはどのくらいかかる?

私の全プロセスは約3週間でした。一次から二次まで3日、二次から三次まで3日、三次からHR面接まで1週間、HR面接からオファーまで3日。チームによって異なる場合がありますので、参考程度に。

Q5:給与はどの程度?

3年のiOS経験で、オファーは業界平均以上でした。具体的な数字は控えますが、面接前に市場相場を調べ、妥当な希望範囲を設定することをお勧めします。

#Xiaomi#iOS面接#Swift Interview#面试 Real Questions