iOSインタビューの準備
大きな日が来ています。 それは電話、オンラインまたは人のインタビューであるかどうかそれは少し緊張に満ちている常にである。 だから、ストレスを和らげるために、あなたはいくつかの準備作業をしました-あなたがインタビューしている会社の宿題を完了し、linkedin&githubであなたが選んだ会社の雇用マネージャーとエンジニアリングチームの半分をストーカーしました、あなたはしばらく使用していないスキルと知識のいくつかをブラッシュアップしました-あなたは行く準備ができています。
しかし、米海軍のシールのモットーに続いて”二つは一つであり、一つはなし”のは、あなたがそのiOSのインタビューをエースを助けるために別の簡単な復習を経 それでは、それに右に取得してみましょう!
あなたがすでに準備ができていることを願っている基本的な質問のいくつかから始めましょう。 彼らは明らかに見えるかもしれませんが、私が技術的なインタビューをしてきた12年間の間に何人のエンジニアが悲惨に失敗したかに衝撃を受け
技術的な質問
さて、それをカバーしたので、技術的な質問に飛び込みましょう。
すべての技術面接の質問のslideshareはこちらを参照してください!Uitableviewcellコンストラクタでの質問1
:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
reuseIdentifier
は何のために使われていますか?
reuseIdentifier
は、UITableView
でセルを再利用できることを示すために使用されます。 たとえば、セルは同じように見えますが、コンテンツが異なる場合などです。UITableView
はUITableViewCell
の内部キャッシュをreuseIdentifier
で維持し、dequeueReusableCellWithIdentifier:
が呼び出されたときに再利用できるようにします。 テーブルセルを再使用すると、新しいビューを作成する必要がないため、tableviewのスクロールパフォーマンスが向上します。質問2
原子合成特性と非原子合成特性の違いを説明しますか?
Atomic and non-atomicは、プロパティのセッター/ゲッターがプロパティの値をアトミックに読み書きするかどうかを指します。 Atomicキーワードがプロパティに使用されると、そのプロパティへのアクセスはすべて”同期”されます。 したがって、getterの呼び出しは有効な値を返すことが保証されますが、これにはパフォーマンスの低下が伴います。 したがって、いくつかの状況では、nonatomicはプロパティへのより高速なアクセスを提供するために使用されますが、まれに(値が別のスレッドから設定され、古い値がメモリから解放されたが、新しい値がまだプロパティのメモリ内の場所に完全に割り当てられていない場合)、競合状態によりプロパティがnilになる可能性があります。
質問3
コピーと保持の違いを説明しますか?
オブジェクトを保持することは、保持数が一つ増加することを意味します。 これは、オブジェクトのインスタンスが保持カウントがゼロになるまでメモリに保持されることを意味します。 プロパティにはこのインスタンスへの参照が格納され、同じインスタンスを保持している他のユーザーと共有します。 コピーは、オブジェクトが重複した値で複製されることを意味します。 それは他の誰とも共有されません。
あなたの技術的なインタビューをエースにしたいですか? 今専門家との技術的なインタビューの練習の会議を予定しなさい!質問4
Objective Cのメソッドswizzlingとは何ですか?
メソッドswizzlingを使用すると、既存のセレクタの実装を、classes dispatchテーブル内の別の実装の実行時に切り替えることができます。 Swizzlingを使用すると、元のメソッドの前および/または後に実行できるコードを記述できます。 たとえば、メソッドの実行にかかった時間を追跡したり、ログステートメント
#import "UIViewController+Log.h"@implementation UIViewController (Log) + (void)load { static dispatch_once_t once_token; dispatch_once(&once_token, ^{ SEL viewWillAppearSelector = @selector(viewDidAppear:); SEL viewWillAppearLoggerSelector = @selector(log_viewDidAppear:); Method originalMethod = class_getInstanceMethod(self, viewWillAppearSelector); Method extendedMethod = class_getInstanceMethod(self, viewWillAppearLoggerSelector); method_exchangeImplementations(originalMethod, extendedMethod); }); } - (void) log_viewDidAppear:(BOOL)animated { ; NSLog(@"viewDidAppear executed for %@", ); }@end
を挿入したりするために、質問5
not-running、inactive、active、background、suspendedの実行状態の違いは何ですか?
- 実行されていません: アプリが起動されていないか、実行されていましたが、システムによって終了しました。
- 非アクティブ:アプリはフォアグラウンドで実行されていますが、現在イベントを受信していません。 (ただし、他のコードを実行している可能性があります。)アプリは通常、別の状態に移行するときに、この状態のままになります。
- アクティブ:アプリはフォアグラウンドで実行中で、イベントを受信しています。 これは、フォアグラウンドのアプリの通常モードです。
- 背景:アプリはバックグラウンドにあり、コードを実行しています。 ほとんどのアプリは、一時停止に向かう途中でこの状態に簡単に入ります。 ただし、余分な実行時間を要求するアプリは、一定期間この状態のままである可能性があります。 さらに、バックグラウンドで直接起動されるアプリは、非アクティブ状態ではなく、この状態になります。
- Suspended:アプリはバックグラウンドで実行されていますが、コードは実行されていません。 システムは自動的にこの状態にアプリを移動し、そうする前にそれらを通知しません。 中断されている間、アプリはメモリに残りますが、コードは実行されません。 メモリ不足の状態が発生した場合、システムは、フォアグラウンドのアプリのためのより多くのスペースを作るために、予告なしに中断されたア
質問6
カテゴリとは何ですか?
カテゴリは、クラスを拡張せずにクラスに追加のメソッドを追加する方法です。 多くの場合、関連するメソッドのコレクションを追加するために使用されます。 一般的なユースケースは、Cocoaフレームワークの組み込みクラスに追加のメソッドを追加することです。 たとえば、非同期ダウンロードメソッドを
UIImage
クラスに追加します。質問7次のコードでバグを見つけて修正する方法を提案できますか:
@interface MyCustomController : UIViewController @property (strong, nonatomic) UILabel *alert; @end @implementation MyCustomController - (void)viewDidLoad { CGRect frame = CGRectMake(100, 100, 100, 50); self.alert = initWithFrame:frame]; self.alert.text = @"Please wait..."; ; dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(10); self.alert.text = @"Waiting over"; } ); } @end
すべてのUIの更新は、メインスレッドで行う必要があります。 上記のコードでは、グローバルディスパッチキューは保証しないため、アラートテキストへの更新はメインスレッドで発生する場合と発生しない場合があ したがって、メインスレッド
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(10); dispatch_async(dispatch_get_main_queue(), ^{ self.alert.text = @"Waiting over"; });});
質問8
viewDidLoad
とviewDidAppear
の違いは何ですか?
ビューに表示するリモートサーバーからデータをロードするには、どのような方法を使用する必要がありますか?
viewDidLoad
は、xibファイル、ストーリーボード、またはloadView
でプログラムで作成されたかどうかにかかわらず、ビューがロードされるときに呼び出されます。viewDidAppear
は、ビューがデバイス上に表示されるたびに呼び出されます。 どちらを使用するかは、データのユースケースによって異なります。 データがかなり静的で、変更されない可能性がある場合は、viewDidLoad
にロードしてキャッシュすることができます。 ただし、データが定期的に変更される場合は、viewDidAppear
を使用してロードする方が良いです。 どちらの状況でも、UIがブロックされないように、データをバックグラウンドスレッドに非同期にロードする必要があります。質問9
リモートサーバーからダウンロードした画像を表示する
UITableViewController
を書くときには、どのような考慮事項が必要ですか?これはiOSでは非常に一般的なタスクであり、ここでの良い答えは知識の全体のホストをカバーすることができます。 質問の重要な情報は、画像がリモートでホストされており、ダウンロードに時間がかかる可能性があるため、「考慮事項」を要求するときは、次のことを話して:
- セルがビューにスクロールされたとき、つまり
cellForRowAtIndexPath
が呼び出されたときにのみ、画像をダウンロードします。- ユーザーがスクロールし続けることができるようにUIをブロックしないように、バックグラウンドスレッド上で非同期的に画像をダウンロー
- 画像がセルのためにダウンロードされたとき、そのセルがまだビュー内にあるかどうか、または別のデータによって再利用されているかどうかを確認す それ以外の場合は、メインスレッドに戻ってセル上の画像を変更する必要があります。
他の良い答えは、画像がダウンロードされている間にプレースホルダ画像を使用して、画像のオフラインキャッシュについて話に行くでしょう。質問10
プロトコルとは何ですか、独自のプロトコルをどのように定義し、いつ使用されますか?
プロトコルはJavaのインターフェイスに似ています。 これは、プロトコルを採用している場合にクラスが実装する必要がある/実装できる必須メソッドとオプションメソッドのリストを定義します。 どのクラスでもプロトコルを実装でき、他のクラスはクラスの型を知らずにプロトコルメソッドに基づいてそのクラスにメッセージを送信できま
@protocol MyCustomDataSource- (NSUInteger)numberOfRecords;- (NSDictionary *)recordAtIndex:(NSUInteger)index;@optional- (NSString *)titleForRecordAtIndex:(NSUInteger)index;@end
一般的なユースケースは、
UITableView
またはUICollectionView
のデータソースを提供することです。質問11KVCとKVOとは何ですか? KVCを使用して値を設定する例を示します。
KVCはキーと値の符号化の略です。 これは、開発時にプロパティ名を静的に知る必要がなく、実行時に文字列を使用してオブジェクトのプロパティにアクセスできるメカニズムです。 KVOはKey-Value Observingの略で、コントローラまたはクラスがプロパティ値の変更を観察することを可能にします。
クラスにプロパティ
name
があるとしましょう:@property (nonatomic, copy) NSString *name;
KVCを使用してアクセスできます:
NSString *n =
そして、我々はそれをメッセージを送信することによって、それの値を変更することができます:
質問12
ブロックとは何ですか、どのように使用されていますか?
ブロックは、Objective-Cクラス全体を記述することなく、単一のタスクまたは動作単位を定義する方法です。 カバーブロックの下にはまだObjective Cオブジェクトがあります。 これらは、objective-Cでラムダやクロージャなどのプログラミング技術をサポートできるようにする言語レベルの機能です。
^ { }
構文を使用してブロックを作成し:myBlock = ^{ NSLog(@"This is a block"); }
それは次のように呼び出すことができます:
myBlock();
これは本質的に関数ポインタであり、コンパイルと実行時に型安全性を強制するために使用できるシグネチャも持っています。 たとえば、特定のシグネチャを持つブロックを次のようなメソッドに渡すことができます:
- (void)callMyBlock:(void (^)(void))callbackBlock;
ブロックにいくつかのデータを与えたい場合は、署名を変更してそれらを含めることができます:
- (void)callMyBlock:(void (^)(double, double))block { ... block(3.0, 2.0);}
質問13
iOSはマルチスレッドをサポートするためにどのようなメカニズムを提供していますか?
NSThread
start
メソッドを呼び出すことで開始できる新しい低レベルスレッドを作成します。NSThread* myThread = initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];;
NSOperationQueue
スレッドのプールを作成し、NSOperation
を並列に実行するために使用できるようにします。NSOperation
sは、NSOperationQueue
にmainQueue
を要求することによって、メインスレッドで実行することもできます。NSOperationQueue* myQueue = init];; ;
- GCDまたはGrand Central Dispatchは、一般的なマルチスレッドタスクをサポートするために使用するメソッドとAPIの豊富なセットを提供するObjective-Cの最新の機能です。 GCDは、メインスレッド、並行キュー(タスクは並列で実行されます)、またはシリアルキュー(タスクはFIFO順序で実行されます)のいずれかでディスパッチ用にタス
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(myQueue, ^{ printf("Do some work here.\n");});
質問14
応答者チェーンとは何ですか?
タッチイベントなどのイベントがビューで発生すると、ビューは
UIView
に関連付けられたUIResponder
オブジェクトのチェーンにイベントを発生させます。 最初のUIResponder
はUIView
自体であり、イベントを処理しない場合は、UIResponder
がイベントを処理するまでチェーンを続けます。 チェーンにはUIViewController
、親UIView
、および関連するUIViewController
が含まれ、いずれもイベントを処理しない場合はUIWindow
が処理できるかどうかを尋ねられ、最後にイベントを処理しなこれを引き出す機会があれば、インタビュアーを感動させる価値があります:
質問15
デリゲートと通知の違いは何ですか?
どちらも、利害関係者に値とメッセージを送信するために使用されます。 デリゲートは一対一のコミュニケーションのためのものであり、Appleが推進するパターンです。 委任では、クラス発生イベントはデリゲートのプロパティを持ち、通常はいくつかの
protocol
を実装することを期待します。 その後、委任クラスは_delegate_sプロトコルメソッドを呼び出すことができます。通知を使用すると、クラスはアプリケーション全体でイベントを任意の関係者にブロードキャストできます。 Broadcastingクラスは、このイベントのリスナーについて何も知る必要はないため、通知はアプリケーション内のコンポーネントを分離するのに非常に便利です。質問16
UIを書くときの好みは何ですか? Xibファイル、ストーリーボード、またはプログラム
UIView
?これには正しい答えも間違った答えもありませんが、それぞれのアプローチの利点と課題を理解しているかどうかを見るのは素晴らしい方法です。 ここで私が聞く一般的な答えは次のとおりです:
- StoryboardとXibは、デザイン仕様に一致するUIをすばやく作成するのに最適です。 また、製品管理者が画面に沿ってどれだけ遠く離れているかを視覚的に見ることも非常に簡単です。
- Storyboardは、アプリケーションを通る流れを表現し、アプリケーション全体を高レベルに視覚化するのにも優れています。
- Storyboardの欠点は、チーム環境では単一のファイルであり、mergeの管理が困難になるため、共同作業が困難であることです。
- ストーリーボードとXibファイルも重複して更新が困難になる可能性があります。 たとえば、すべてのボタンが同一に見える必要があり、突然色を変更する必要がある場合、ストーリーボードとxibでこれを行うのは長い/困難なプロセスにな
- プログラムで
UIView
を構築することは冗長で退屈なことがありますが、より大きな制御とコードの分離と共有を容易にすることができます。 彼らはまた、より簡単に単体テストすることができます。ほとんどの開発者は、コードを共有してから
UIView
またはXib
ファイルを再利用することが理にかなっている3つすべての組み合わせを提案します。質問17
プライベートユーザーデータをオフラインでデバイスに安全に保存するにはどうすればよいですか? 他にどのようなセキュリティのベストプラクティスを取るべきですか?
ここでも正しい答えはありませんが、人がiOSのセキュリティをどれだけ掘り下げているかを見るのに最適な方法です。 あなたが銀行にインタビューしているなら、私は誰かがそれについて何かを知っていることをほぼ間違いなく期待していますが、すべての企業はセキ:
- データが非常に敏感である場合は、すべてのデバイスがクラック可能であるため、それはデバイス上でオフラインで保存されるべきではありません。
- キーチェーンは、データを安全に保存するための一つのオプションです。 ただし、暗号化はデバイスのpinコードに基づいています。 ユーザーはpinを設定することを余儀なくされていないので、状況によってはデータが暗号化されないことさえあります。 さらに、ユーザーのpinコードは簡単にハッキングされる可能性があります。より良い解決策は、完全に暗号化されたSQLiteデータベースであるSQLCipherのようなものを使用することです。 暗号化キーは、アプリケーションによって適用され、ユーザーのpinコードから分離することができます。
その他のセキュリティのベストプラクティスは次のとおりです:
- SSL/HTTPS経由でのみリモートサーバーと通信します。
- 可能であれば、公共のWiFiへの中間者攻撃を防ぐために、アプリケーションに証明書のピン留めを実装します。
- 機密データを上書きしてメモリから消去します。
- 送信されるデータのすべての検証がサーバー側でも実行されていることを確認します。MVCとは何ですか、iOSではどのように実装されていますか?
あなたはそれで経験したいくつかの落とし穴は何ですか? MVCに代わるものはありますか?MVCは、モデル、ビュー、コントローラの略です。 これは、ユーザーインターフェイスを実装するときにロジックを分離する方法を定義するデザイ IOSでは、Appleはすべての_View_sの基本クラスとして
UIView
を提供し、UIViewController
はビュー内のイベントをリッスンし、データが変更されたときにビューを更新できるコントローラをサ モデルはアプリケーション内のデータを表し、NSArray
やNSDictionary
などのデータコレクションを含む任意のNSObject
を使用して実装できます。人々が打つ落とし穴のいくつかは、
UIViewController
肥大化しており、MVC形式を超えたクラスにコードを分離していません。 私はこれに対するいくつかの解決策を読むことを強くお勧めします:
- https://www.objc.io/issues/1-view-controllers/lighter-view-controllers/
- https://speakerdeck.com/trianglecocoa/unburdened-viewcontrollers-by-jay-thrash
- https://programmers.stackexchange.com/questions/177668/how-to-avoid-big-and-clumsy-uitableviewcontroller-on-ios
代替案の面では、これはかなりオープンエンドです。 最も一般的な代替手段はReactiveCocoaを使用するMVVMですが、VIPERや機能的なリアクティブコードを使用するものもあります。質問19
あなたの会社のプロダクトマネージャーがアプリケーションがクラッシュしていると報告します。 あなたは何をしますか?
これはどのプログラミング言語でも素晴らしい質問であり、実際に問題がどのように解決するかを確認するように設計されています。 あなたは多くの情報を与えられていませんが、あなたが一緒に行くようにいくつかのインタビューはあなたに問題の詳細をスリップします。 簡単な開始:
- それを再現するための正確な手順を取得します。
- デバイス、iOSのバージョンを確認します。
- 彼らは最新バージョンを持っていますか?
- 可能であればデバイスログを取得します。
それを再現したり、より多くの情報を得たりしたら、ツールの使用を開始します。 誰かがInstruments leak toolを使用することを提案するのを見ることを期待しています。 本当に印象的な候補者は、問題を再現し、それを介してデバッグする単体テストを書くことについて話し始めるでしょう。
この質問の他のバリエーションには、遅いUIやアプリケーションの凍結が含まれます。 再びアイデアは、あなたが問題を解決する方法を見ることです、あなたがそれについて知っているツールは何ですか、そしてあなたはそれらを正しく使質問20
AutoLayoutとは何ですか? IOSによって制約が「壊れている」とはどういう意味ですか?
AutoLayoutは、他のビューに対する相対的または明示的な値に基づいて位置とサイズを指定する一連の制約を使用して
UIView
をレイアウトする方法です。 AutoLayoutを使用すると、画面のサイズと向きに基づいて、コンポーネントのサイズを変更したりレイアウトしたりする画面を簡単に設計できます。 _Constraint_sには次のようなものが含まれます:
- 2つのビュー間の水平/垂直距離を設定する
- 高さ/幅を別のビューに対する比に設定する
- 幅/高さ/間隔は、明示的な静的値
制約が互いに競合することがあ たとえば、2つの高さの制約を持つ
UIView
を想像してみてください:1つはUIView
200pxを高くし、2つ目は高さをボタンの高さの2倍にすると言います。 IOSランタイムがこれらの制約の両方を満たすことができない場合は、1つだけを選択する必要があります。 もう1つはiOSによって「壊れている」と報告されます。標準的な質問
“自分のことを教えてください。”
これは本当にトリッキーなものです! そう多くの人々は彼らの履歴書を大声で読む(私がそれを右に見ていることを忘れている!)、彼らは大学で取ったすべてのクラスを一覧表示し、彼らが今まで開催しているすべての位置(そしてそれは本当に上級レベルのエンジニアのために だから、20分後、私はまだ候補者についての履歴書の新しい/外の何も知らない、我々は20分であり、それまでに私は彼らが同様にロボットかもしれないと信
だから、あなたの背景の2分の長いエレベーターピッチを準備することによって、自分自身(と雇用マネージャー)に好意を行います-それはシンプルで簡潔で簡 あなたは走るのが大好きですか? あなたの娘のサッカーチームをコーチしていますか? ダイ-ハード-スター-ウォーズファン? 個性の少しを追加することは素晴らしいアイスブレーカーであり、インタビューのより深い部分に驚くべき移行のためになります。
“興味深い問題とそれをどのように解決したかを説明してください。”
これを聞くチャンスは基本的に99%なので、彼らのために素晴らしい答えを用意しておいた方がいいです! ここに少数の先端はある:自慢している特にすばらしいプロジェクトについて考えなさい。 分かったか? すごい! 今、一枚の紙をつかむし、5箇条書きでそれを要約します。
第1弾-プロジェクトの背後にある状況の非常に簡単な裏話
第2弾-プロジェクト自体の性質
第3弾-それを解決しながら遭遇した問題/それら
第4弾-どのように
第5弾の困難を解決しましたか-それから何を学んだのですか。さて、聞いてくれる人(友人、パートナー、同僚)を見つけて、話が理にかなっているかどうかを尋ねます(あなたが話している人があなたの仲間ではない場合、そ これは、物語が一緒に自分自身を保持しているかどうかを検証するための素晴らしい方法です。
あなたは私が”そして、私はジョンのところに行き、彼は彼が作成したツールを使って重大なバグを取り除くために……”のようなことを何度も聞いたことがあ トムは誰ですか? あなたのマネージャー? インターン? ピア? なぜあなたはあなたの会社のみんなの彼に行ったのですか? 彼が一緒に入れているその魔法のツールは何ですか? どの重要なバグを正確に削除し、どのようにしましたか? 結果は何でしたか?
あなたはアイデアを得る
追加ボーナス? あなたは今、あなたが大声で彼の履歴書を読んでいるその男のように見えることなく、あなたのインタビュー中にチートシートとして使用することがで
さて、いくつかの雇用管理者があなたのゲームをオフにあなたを傾けるために投げるのが好き奇妙な質問に飛び込むことができます。
- どのようにトースターをテストしますか?
- 飛行機には何本のペンを入れることができますか?
- サンフランシスコにはいくつの窓がありますか?
- スクールバスには何個のゴルフボールが収まるのですか?
- マクドナルドは米国で毎年何台のビッグマックを販売していますか?
リストは続いています。 それはあなたの技術的なスキルとは何の関係もありませんが、それはあなたがカーブボールをどのように扱うかをチェックし、あなたが論理的な段階的な問題解決が可能であるかどうかを確認する良い仕事をしています。 ほとんどの場合、これらのタイプの質問に対する完璧な回答はありません(ただし、安心してgoogleを使用することはできます)。 それはあなたの面接者にあなたの論理をいかにについて説明するか完全にある。
ここでは、マイケルBeauchampによるゴルフボールの質問への答えですので、あなたは私が話していることのアイデアを得ます:
私は、標準的なスクールバスが幅約8フィート×高さ6フィート×長さ20フィートであると考えています-これは、すべての方向の交通が停止している間、私がスクールバスの後ろに閉じ込められている何千時間もに基づく単なる推測です。
は960立方フィートを意味し、立方フィートには1728立方インチがあるので、約1.6万立方インチを意味します。
ゴルフボールの体積を約2.5立方インチ(4/3*pi*。85)として。85インチはゴルフ-ボールの半径である。
その2.5立方インチを1に分割します。6百万そして660,000のゴルフ-ボールを思い付く。 しかし、そこに座席とがらくたがあるので、スペースを取って、またゴルフボールの球形の形状は、積み重ねたときにそれらの間にかなりの空きスペースがあ
参照してください? 一歩一歩。 そして突然、それは比較的単純で論理的な質問です。 ちょうど穏やかな滞在し、あなたの頭の中でインスタント番号を思い付くしようとするのではなく、あなたとの思考のあなたの列車を介してインタバ
実際の生活の練習が必要ですか? 12年間テクニカルインタビューを行ってきたマットとの模擬面接をスケジュールし、彼のフィードバックを求めること自由に感じ