blog

まとめ-回答

SwiftではStatic Dispatchの他にDynamic Dispatchがあり、Dynamic DispatchはV-Table DispatchやWitness Table Dispatc...

Feb 7, 2020 · 18 min. read
シェア

Swift

  1. Swift の struct と class の違いは何ですか?
参照型価値観タイプ
継承を許可継承不可
初期化の必要性初期化不要
参照型はポインタのコピー、値型はオブジェクトのコピー
  1. Swift のメソッド呼び出しの形式は何ですか?

Swift では、Static Dispatch に加えて、V-Table Dispatch、Witness Table Dispatch、objc_msgSend の形で実装されている Dynamic Dispatch もあります。 プロトコルメソッドがクラス自体のオブジェクトから呼び出されるとき、それは、上で見つかったように、通常のメソッド呼び出しと同じようにディスパッチされます; しかし、プロトコルメソッドがプロトコルオブジェクトから呼び出されるとき、すべてのメソッドは、それが構造体であるかクラスであるかに関係なく、同じようにディスパッチされます。プロトコルメソッドがクラス自身から呼び出されるとき、上で見つかったように、それは、通常のメソッド呼び出しと変わらない、あるべきようにディスパッチされます; しかし、プロトコルメソッドがプロトコルオブジェクトから呼び出されるとき、それが構造体であるかクラスであるかに関係なく、すべてのメソッドは、Witness Tableに基づいたフォームを使用してディスパッチされます。

Swift でのメソッド呼び出し

  1. スウィフトとOCの違いは何ですか?

Swift メソッドコール

  1. OCからSwiftに移行する際、どのような問題に遭遇しましたか?

  2. プロトコル指向プログラミングをどのように理解していますか?

オブジェクト指向とプロトコル指向の最も明らかな違いは、抽象データの使用方法です。オブジェクト指向では継承を使用しますが、プロトコル指向では固守を使用します。プロトコル指向の設計では、Appleは参照型よりも値型の使用を推奨しています。プロトコル指向がオブジェクト指向よりも特定のビジネスニーズに合っているという良い例があります。その中で、3つの交通手段:飛行機、車、自転車、3つの動物:トラ、馬

Swiftにおけるプロトコル指向プログラミング

プロトコル指向プログラミングとCocoaの出会い

Swift-プロトコル指向プログラミング-コンポーネント化

SwiftとObjective-Cに焦点を当てた考察。

OC

  1. ブロックはどのように実装され、ブロックの対応するデータ構造はどのようなものですか?ブロックの機能は何ですか?対応するデータ構造はどのようなものですか?

    • ブロックは基本的にOCオブジェクトで、その中にisaポインタを持ち、このオブジェクトは関数呼び出しアドレスと関数呼び出し環境をカプセル化します。
    • ブ ロ ッ ク の基礎デー タ 構造は main_block_impl_0 構造化オブジ ェ ク ト であ り 、 2 個の構造化オブジ ェ ク ト メ ンバ block_impl と __main_block_desc_0 を持ち ます。
    • (__blockはブロック外部の変数を取り込むために使用され、コンパイラはブロック変数をオブジェクトで包みます)
  2. GCDのブロックはヒープ上かスタック上か?

  3. NSCodingプロトコルは何をするのですか?

NSCodingは、-initWithCoder:とencodeWithCoder:という2つのメソッドを持つシンプルなプロトコルです。NSCoding プロトコルに従ったクラスはシリアライズとデシリアライズが可能で、ディスクにアーカイブしたり、ネットワーク経由で配布したりすることができます。

NSCoding / NSKeyedArchiver

  1. KVO実現の原則

オブジェクトがKVOリスナーを使用する場合、iOSはこのオブジェクトのisaポインタを変更し、Runtimeを通じて動的に作成された新しいサブクラスを指すようにします。サブクラスはsetメソッドの独自の実装を持ち、setメソッドの実装の内部でwillChangeValueForKeyメソッド、セッターメソッドの元の実装を順次呼び出します、didChangeValueForKeyメソッドはリスナーのobserveValueForKeyPath:ofObject:change:context:リスナーメソッドを呼び出します。

iOSの基本原理のまとめ - KVOの本質を探る

  1. NSOperationはGCDに比べてどのような特徴があり、どのようなAPIを持っていますか?

GCDの効率の直接使用は確かに、NSOperationはもう少しオーバーヘッドになりますが、NSOperationを介して依存関係、優先順位、継承、キーと値のペアをこれらの利点を観察するために取得することができますので、より多くのオーバーヘッドの少しは確かに非常に費用対効果の高いに比べて、魚と熊の足の両方にすることはできません、トレードオフは、開発者自身のマルチスレッドNSOperationとGCDの違いにある

  1. NSNotificaitonは同期か非同期か、また、通知を送信するときにサブスレッドにある場合、どのスレッドで受信するのでしょうか?

Synchronous、synchronous、asynchronousはすべて、通知が送信されるスレッドに対する相対的なものです。notificationを投稿するときにサブスレッドにいる場合は、もちろん、receiveメソッドもサブスレッドでトリガされます。

NSNotificationについては、以下を読めば理解できると思います。

NSNotificationは同期か非同期か?

UI

  1. イベント・レスポンス・チェーンはどのように渡されるのですか?
  1. 非同期レンダリングとは何ですか?

非メインスレッドでレイヤーのコンテキストにコンテンツを描画することはできませんが、描画が必要なコンテンツを自分で作成した run private_context に描画することはできます。CGBitmapContextCreate() によって CGCentextRef を作成し、非同期スレッドでこのコンテキストを描画に使用します。をセットして非同期描画を完了します。

NSCoding / NSKeyedアーカイバ

  1. layoutsubviewsはどのタイミングで呼び出されますか?

    • initの初期化がlayoutSubviewをトリガーしません。
    • addSubview は layoutSubviews をトリガーします。
    • ビューのフレームを設定すると、layoutSubviewsがトリガーされます。もちろん、フレームの値が設定の前後で変更されていることが条件です。
    • UIScrollView をスクロールすると layoutSubviews がトリガーされます。
    • Screenを回転させると、親UIViewのlayoutSubviewsイベントがトリガーされます。
    • UIViewのサイズを変更すると、親UIViewのlayoutSubviewsイベントもトリガーされます。

    layoutSubviews 呼び出しのタイミング

  2. 写真のプレゼンテーションにはどのような段階があるのですか?

    • 1).生の圧縮イメージデータをディスクから読み込み、メモリにキャッシュします。
    • 2).CPUで非圧縮イメージデータに展開
    • 3).イメージのレンダリング

    古典的な MVC アーキテクチャに従って、UIImage はモデルの役割を果たし、イメージデータの運搬を担当し、UIImageView は View の役割を果たし、イメージのレンダリングと表示を担当します。このシステムは非常にシンプルなインターフェイスを提供し、デコード処理を隠します。

    iOSイメージのベストプラクティスのまとめ

    イメージの解凍からレンダリング処理

  3. オフスクリーンレンダリングとは何ですか?

GPUがレンダリング操作のために現在のスクリーンバッファの外側にバッファを開くことを意味します。

ディスプレイにコンテンツを表示するためには、ピクセルデータの格納領域として、少なくとも画面上のピクセルデータ量と同じ大きさのフレームバッファが必要で、GPUはここにレンダリング結果を格納します。レンダリング結果をフレームバッファに直接書き込めない制約がある場合、別のメモリ領域に一時的に保存してからフレームバッファに書き込む処理をオフスクリーンレンダリングと呼びます。

オフスクリーンレンダリングは、以下のプロパティが設定されている場合にトリガーされます:

- shouldRasterize
- masks
- shadows
- edge antialiasing
- group opacity

iOSのオフスクリーンレンダリングの詳細

NSNotification同期か非同期か?

  1. フレームワークとしてのCoreAnimationの役割と、UIKitとの関係は?

Core Animationは、実際の描画のほとんどを専用のグラフィックスハードウェアに任せるロジックで実装されており、CPUに負荷をかけることなく、高いフレームレートとスムーズなアニメーションを実現します。アプリケーションの速度を低下させることなく、高いフレームレートとスムーズなアニメーションを実現します。

以下の図は、CoreAnimationとUIKitフレームワークの関係を表していますCore Animation Summary

コアアニメーションの概要

引用カウント

  1. ARC方式の原理は何ですか?暗黙の加算解放操作はいつ行われるのですか?

参照カウントは、オブジェクトのライフサイクルを管理するシンプルで効果的な方法です。

新しいオブジェクトが作成されると、そのオブジェクトの参照カウントは1になります。新しいポインタがそのオブジェクトを指すようになると、その参照カウントは1増加します。

これがARCの仕組みです:

ソースコードをコンパイルする際、コンパイラはソースコード内の各オブジェクトのライフサイクルを分析し、これらのオブジェクトのライフサイクルに基づいて、対応する参照カウント操作コードを追加します。つまり、ARCはコンパイル時に機能する技術的ソリューションなのです。

ARCとその実装方法を簡単に説明します。

変数のスコープが終了したときに、その変数を解放するためのrelease関数を自動的に追加します。

ARCの原則を探る

  1. 循環参照にはどのようなシナリオがあり、どうすれば回避できますか?
    • NSTimer
    • block
    • delegate

メソッドを扱います:

Timer: NSTimerは、何らかのクラスのメンバ変数として使われることが多く、NSTimerの初期化でselfをtargetに指定する必要があるため、循環参照が発生しやすくなります。 また、タイマがvalidate状態になっていると、その参照カウントは常に0より大きくなるので、タイマを使わなくなったら、まずinvalidateメソッドを呼び出すべきです。

コピー内の block: ブロックの使用は、ブロック内で使用されているオブジェクトを強く参照するために使用されるか、returnCount が 1 増加します(非ARC)。または self.otherVar = XXX; または _otherVar = ...}; ループが発生する理由: self->block->self または self>block->_ivar

プロキシ:デリゲート問題の循環参照の問題は、キラーの問題を回避するためにも泣くのは簡単ですが、アドバイスの言葉:割り当て(MRC)または弱い(ARC)とデリゲートを宣言し、少し保持または強い再生するために安くはない、結局のところ、これは基本的に循環参照を逃れることはできませんされています!

  1. weakSelfを宣言するためにブロックを使うとき、なぜブロックの内側でstrongを使う必要があるのですか?

__weak typeof(self) weakSelf = self;私たちは、循環参照を解決するために使用されますので、完了した後、あなたは確かにこの書き込みは完璧ではないことを感じるだろう、__strongがあるはずですので、なぜあなたはこの__strongそれを使用したいですか?そうです、*"早期リリース "*を防ぐために。

iOS:ブロック循環参照

  1. Autoreleasepoolの実装メカニズムは何ですか?いつ内部のオブジェクトを解放するのですか?その内部データ構造はどのようなものですか?私がSentinelオブジェクトについて言及するとき、私は引き続き、Sentinelオブジェクトの目的は何か、なぜそれが設計されたのか?

オートリリースの本質は、リリース・メソッドの呼び出しを遅らせることです。

objc_autoreleasePoolPush() [obj release] とobjc_autoreleasePoolPop(void *) 1つのオートリリースプールを実行するプロセスは、単純に3つのプロセスとして理解することができます。

リリース時間: オートリリース・プールが破棄されるまで待ちます。

iOS -- オートリリースとオートリリースプール

内部構造:

  • は、双方向リンク形式によって、スタックをノードとして組み立てられています。
  • スレッドと一対一対応です。

Core Animation

Core Animation

  1. どのようなオブジェクトがAutoreleasepoolに入りますか?

alloc, copy, mutableCopy そして新しい__attribute((ns_returns_retained))__attribute((ns_returns_not_retained))れらのメソッドはデフォルトでマークされ、これらのメソッドによって作成されたオブジェクトは、コンパイラが呼び出しメソッドの周辺にメモリ管理コードreturn/releaseを追加するので、スコープの最後で解放されます。これらのキーワードで始まらないメソッドはデフォルトでマークされ、コンパイラは自動的にメソッド内にオートリリースメソッドを追加し、作成されたオブジェクトは同時にオートリリースプールに登録され、そのリリースはオートリリースプールが破棄されるまで遅延されます。コンパイラは自動的にメソッド内に autorelease メソッドを追加し、作成されたオブジェクトは autorelease プールに登録され、その解放は autorelease プールが破棄されるまで遅延されます。

iOS -- オートリリースとオートリリースプール

  1. weakの実装原理は?参照オブジェクトが破棄されたときの内部ハッシュテーブルの管理方法は?

weakの原理は、ハッシュテーブルのweak_table_t構造の維持にあり、キーは参照されるオブジェクトのアドレス、値はweakポインタの配列のアドレスです。

weakキーワードは弱い参照として動作し、参照されたオブジェクトのカウンタは1インクリメントされず、参照されたオブジェクトがリリースされると自動的にnilに設定されます。

オブジェクトが解放されると、clearDeallocating関数が呼び出され、オブジェクトのアドレスに従ってすべての弱いポインタのアドレスの配列を取得し、その配列のデータをイテレートしてnilに設定し、最後にweakテーブルからエントリを削除し、最後にオブジェクトのレコードをクリーンアップします。

ARC原則を探る

弱い実装の原則

1, 初期化: ランタイムは objc_initWeak 関数を呼び出し、オブジェクトのアドレスへの新しい弱いポインタを初期化します。

2、参照を追加:objc_initWeak関数は、objc_storeWeak()関数を呼び出します、objc_storeWeak()は、弱い参照の対応するテーブルの作成を指すようにポインタを更新することです。

3、リリース、clearDeallocating関数を呼び出します。clearDeallocating関数は、最初のオブジェクトのアドレスによると、配列のすべての弱いポインタのアドレスを取得し、nilにその中のデータを設定するには、この配列を横断し、最後に弱いテーブルからこのエントリを削除し、最後にオブジェクトのレコードをクリーンアップします。

iOSのメモリ管理

Runtime

  1. メッセージを送るプロセスとは?

1, コンパイラはメッセージを 'objct_msgSend(id , SEL, ...)' に送信します。アセンブリコードのステップ処理によって、最終的にこのメソッドlookUpImpOrForward(最新のソースコード)になります。

2、最初に判断するかどうか、現在のオブジェクトは、直接nilを返すことです。

3は、実行時に、オブジェクトが最初にisaポインタを介して対応するクラスを指すようになります。

4、cache_tのルックアップでSELシグネチャを介して、そこに戻り値です。

5、見つけるためにmethod_listがない、キャッシュに追加され、コールバックがあります。

ルートクラスNSObjectまで、サイクルをトラバースされている、探し続ける6、親クラスを見つけるためにsuper_classがありません。

7、上記のすべてを見つけるために失敗し、動的解析し、最終的にメッセージの転送を入力します。

iOS -- Autorelease & AutoreleasePool

  1. オブジェクトの関連付けでメモリ・リークが発生する条件とは?

循環参照

  1. メッセージ転送の流れとは?autoreleasepool実現の原則

    AutoreleasePoolの実装原理

  2. カテゴリに属性を追加できますか?インスタンス変数を追加できますか?

カテゴリに属性を追加するには、Objective-Cの動的な性質を利用して、実行時に動的に属性を追加し、動的にバインドします。

iOS -- Autorelease & AutoreleasePool

いいえ、Objective-Cが提供する実行時関数の中には、確かにクラスにメンバ変数を追加するためのclass_addIvar()関数がありますが、これは「クラスの構築中」にしか呼び出すことができません。クラスが定義されると、それ以上変数を追加することはできません。コンパイルされたクラスは、アプリケーションの起動時にランタイムによってロードされるため、addIvarを呼び出す機会はありません。

iOSクラスにインスタンス変数を動的に追加することの考察5.メタクラスの役割とは?

  • Objective-Cのオブジェクトは、Cの構造体のカプセル化です。
  • すべてのオブジェクトは、そのオブジェクトが属するクラスへのisaポインタを持っています。クラスはオブジェクトでもあり、クラスオブジェクトのisaポインタはクラスのメタクラスを指します。
  • クラスはメンバ変数やメソッドリストなどオブジェクトの特徴を記述し、メタクラスはクラスのクラスメソッドなどクラスの特徴を記述します。
  1. クラス・メソッドの保存先は?クラスのプロパティは?

    • オブジェクトのメソッド、プロパティ、メンバ変数、プロトコル情報はクラスオブジェクトに格納されます。
    • クラス・メソッドはメタクラス・オブジェクトに格納されます。
    • メンバ変数の特定の値はインスタンスオブジェクトに格納されます。

      iOSメモリ管理
  2. いくつかのランタイムシナリオ

iOS]ランタイムの使用シナリオ - ハンズオン

iOSランタイムの役割とアプリケーションのシナリオ

Runloop

  1. Runloopの理解について教えてください。

文字通り、これは実行中のループですが、実際には、ループの内部で常に様々なタスクを処理しているdo-whileループです。

スレッドはRunLoopに対応し、メインスレッドのRunLoopはデフォルトですでに開始されており、サブスレッドのRunLoopは手動で開始する必要があります。

RunLoopは開始するモードを1つだけ選択することができ、現在のモードにソース、タイマー、オブザーバーがない場合は、直接RunLoopを終了します。

Runloopの簡単な理解2.Runloopで何ができるのか?- 常駐スレッドをスタートさせる - サブスレッドでタイマーをスタートさせる - サブスレッドで長時間のモニタリングを行う - タイマーを特定のモードで実行するようにコントロールすることができる - いくつかのイベントを特定のモードで実行させることができる - 例えば、クリックイベントの処理をリッスンするために、RunLoopの状態をリッスンするオブザーバーを追加することができます。

ランループを理解するための簡単な考察

パフォーマンス最適化

  1. TableViewのパフォーマンスを最適化する方法は?
    • 最も一般的なのは、セルの再利用、識別子の再利用登録です。
    • セルの再レイアウトの回避
    • セルのプロパティとコンテンツを事前に計算してキャッシュします。
    • 一部更新と活用
    • セル内のコントロール数を減らす
    • 行の高さをキャッシュ
    • 不透明ビューの使用
    • セルのアニメーションと描画
    • 読書回数の削減
    • メインスレッドをブロックしない
    • 内部セルイメージ処理

iOS-UITableViewのパフォーマンス最適化

  1. XcodeのInstrumentsには、どのようなデバッグツールがありますか?
1.ブランクさまざまなツールを追加するためにカスタマイズできる空のテンプレートを作成します。
2.アクティビティモニター2.Activity Monitor
3.割り当てトレース・ドキュメントに Allocations と VM tracker を追加し、このツールを使って、どのように、どのメモリがメモリやオブジェクトに割り当てられるかを監視します。
4.ココアレイアウトはCocoaレイアウト・ツールで、iOSエミュレータやCocoaデスクトップ・アプリに適用できますが、接続されたiOSデバイスでは使用できません。NSLayoutConstraintオブジェクトの変化を観察して、制約がいつ、どこで意味を持つかを判断します。
5.コア・アニメーションCoreAnimationをトラッキングドキュメントに追加することで、iosデバイス上の1秒あたりのCoreAnimationフレーム数を測定することができ、コンテンツがどのようにスクリーンにレンダリングされるかを理解するのに役立ちます。
6.コアデータCoreData データ抽出、キャッシュ・ミス、およびストレージをトレース・ドキュメントに追加し、このツールを使用してアプリケーション内のデータ・ストレージの相互作用を検出します。
7.カウンター時間またはイベントベースのサンプリング方法を使用して、パフォーマンス・モニタリング・カウンター・イベントを収集します。

INSTRUMENTSデバッグ・ツールの使用

  1. パフォーマンスを最適化するために行ったことを教えてください。
  1. どのようにしてラグを検出するのですか?
    • FPS
    • RunLoop
    • サブスレッドPing

iOS遅延監視ソリューションの概要

  1. バッグのサイズを小さくする選択肢は?

iOSアプリまたはスタティックライブラリのサイズを縮小

iOSのipaサイズを縮小

コンピュータ関連

  1. プロジェクトをコンパイルするプロセスとは?携帯電話のアプリは、アイコンをクリックしてから最初の画面内容が表示されるまで、どのような手順を踏むのでしょうか?

コンパイルプロセス:

xcodeのコンパイルプロセス

iOSコンパイルプロセスの詳細

iOSコンパイルの詳細

起動プロセス:

iOS-APPの起動フローとライフサイクル2.一般的にスタック上に格納される基本データ型について、ヒープ上に存在することは可能ですか、またどのような状況でヒープ上に格納されますか?3.データベースにおけるトランザクションの意味は?

トランザクションは、論理単位として実行される操作のコレクションです。これは、ユニットのデータの一貫性を維持するために、データベースは、一貫性のある状態から新しい一貫性のある状態にされ、簡単に言えば、処理手順のいずれかのセットがすべて発生するか、またはステップが実行されていない場合、トランザクションの処理手順のグループと呼ばれます。これは、データの整合性と信頼性を破壊しないように、データが常に一貫性のある状態であることを保証します。トランザクションが実行された後、DBMSは自動的にデータベース内のデータの整合性をチェックします。

データベースにおけるトランザクションの意味4.どのようなデータベースが使用され、Realmを使用している間の考慮事項やバッチ操作を実現する方法は何ですか?

iOS ipaサイズの縮小

  1. LRUアルゴリズムを理解し、LRUアルゴリズムのセットを実装する方法



LRUキャッシュ除去アルゴリズムの迅速な実装

  1. どのようなデザインパターンが知られていて、どのように理解するのですか?

iOSデザインパターンの解説

  1. Int型の数字が1,000万個あったら、どうやって並べ替えますか?

1,000万個の整数を素早くソートする方法

データ構造とアルゴリズム

  1. ハッシュ・テーブルとは何か、ハッシュの衝突とは何か、ハッシュの衝突を解決する方法は?
  2. バイナリツリーをトラバースするには?
  3. クイック・ソートのプロセスを簡単に説明してください。
  4. 整数の配列がありますが、奇数が前に、偶数が後ろに来るように、配列を一度だけ繰り返し処理するにはどうしたらいいですか?
  5. 階段を登っているとします。頂上まで登るにはn段必要です。一度に登れる段数は1段か2段です。あなたは何通りの登り方ができますか。
  6. 32ビットの符号付き整数が与えられたら、整数の各ビットの数値を反転させる必要があります。
  7. 赤. 黄色。 青い風船。カウボーイキングダムでは、赤い風船1個+黄色い風船1個+青い風船1個で宝くじ1枚と交換できます。赤い風船2個+黄色い風船1個で青い風船1個と交換できます。黄色い風船2個+青い風船1個で赤い風船1個と交換できます。青い風船2個+赤い風船1個で黄色い風船1個と交換できます。今、牛は赤い風船、b黄色い風船、c青い風船を持っています。 牛は交換できるチケットの最大数を知りたがっています。

履歴書関連問題

  1. ロッティのアニメーション効果の原理は何ですか?

Lottieアニメーションの使用と原理解析2.静的解析を実現するOClintの原理とその方法とは?

Clang、InferとOCLint , 静的解析の実行

OCLint 静的コード検査の実践

  1. MVVMとMVCの違いは何ですか?
  1. スタティック・ライブラリとダイナミック・ライブラリの違いは何ですか?

iOSの動的ライブラリと静的ライブラリの違い

  1. Flutterを知っていますか?UIKitを使っていて、どのようにUIをレンダリングするのですか?

  1. バイナリー・リアレンジメントの核となる根拠は何ですか?

バイナリ再配置に基づくiOSスタートアップ最適化

バイナリ再配置ベースのソリューション7.どのように切り替えテーマソリューションのセットを設計するには?高速なテーマ切り替えを実現するiOSのための詳細なチュートリアル8. AVPlayerとIJKPlayerの違いは何ですか?IJKPlayerを使用してビデオリストの各ビデオの最初の1秒をキャッシュするには?[IJKPlayerを使用してビデオリストの各ビデオの最初の1秒をキャッシュするには?

  1. パイソンで何が行われていますか?スクリプト言語を理解するには?

ソフトスキル

  1. 職務以外でどのようなことをしてきましたか?
  2. これまで経験した事業展開の中で最も困難だったことは何ですか?
  3. 最近、何か新しいスキルを学びましたか?何を学びましたか?
  4. iOSのどのような側面を最もよく知っていますか?それはどのように現れますか?
  5. 一般的に使われているオープンソースのライブラリと、その原理を勉強したことはありますか?
  6. 個人的な成長を維持する方法は?

プロセスベースの問題

  1. なぜお辞めになったのですか?
  2. 次の仕事への期待は?

Read next

日1リート(連鎖表に展開されたバイナリーツリー)難易度:中-日

バイナリツリーが与えられたら、それをその場で1つのリンクされたテーブルに展開します。

Feb 7, 2020 · 3 min read