私はObjective Cの動的バインドと動的タイピングの違いを理解するのに苦労しています。Objective Cの動的バインドと動的タイピングの違いは何ですか
答えて
Dynamic typing Objective-Cでは、タイプid
のオブジェクトのクラスはコンパイル時には不明であり、実行時にメッセージがオブジェクトに送信されたときに検出されることを意味します。たとえば、次のコードでは、メッセージcomponentsSeparatedByString:
を送信しようとするまで、foo
のクラスは不明です。
id foo = @"One Two Three";
NSArray *a = [foo componentsSeparatedByString:@" "];
代わりid
データ型を使用しての私たちは次のことを行っていた場合...
NSString *foo = @"One Two Three";
...その後、私たちは静的型付けではなく、動的型付けを使用しているはずです。
Dynamic bindingは、どのメソッドの実装が選択されるかをコンパイラが知らないことを意味します。代わりに、メソッドの実装は、メッセージの送信時に実行時に参照されます。基本的にはPolymorphismでお手伝いします。もしそうであれば別の方法の実装を呼び出すことで
[foo description]
結果は、例えば、foo
はNSArray
のインスタンスではなくNSString
のインスタンスです。
動的タイピングでは、任意のタイプのオブジェクトを格納できるid型の変数を持つことができます。動的バインディングでは、id obj; [obj doWhatever];
とを実装するタイプのobj
であれば動作します。
ダイナミック
アップルのドキュメントからオブジェクトの種類、それが指すがコンパイル時にチェックされていない場合、変数は動的型付けされ
を入力します。 Objective-Cはidデータ型を使用して、オブジェクトの種類を指定せずにオブジェクトである変数を表します。これは動的タイピングと呼ばれます。
動的タイピングは、システムがコンパイル時にオブジェクトが属するクラスを明示的に識別する静的型付けとは対照的です。コンパイル時の静的型チェックにより、より厳密なデータの整合性が保証されますが、その整合性と引き換えに、動的型指定により、プログラムはさらに大きくなります。柔軟性また、オブジェクトのイントロスペクション(たとえば、動的に型指定された匿名オブジェクトにそのクラスがあるかどうかを問い合わせるなど)によって、実行時にオブジェクトの型を検証し、特定の操作に対する適切性を検証できます。
次の例では、オブジェクトの異種コレクション使用して、動的型付けを示しています。あなたはそれに送るどんなメッセージに応答することができなければならない
NSArray *anArray = [NSArray arrayWithObjects:@"A string", [NSDecimalNumber zero], [NSDate date], nil];
NSInteger index;
for (index = 0; index < 3; index++) {
id anObject = [anArray objectAtIndex:index];
NSLog(@"Object at index %d is %@", index, [anObject description]);
}
オブジェクトは、実行時に変数によって指さを。それ以外の場合、プログラムは例外をスローします。呼び出されるメソッドの実際の実装は、動的バインディングを使用して決定されます。
結合
動的結合動的実行時に代わりにコンパイル時に起動する方法を決定することです。動的バインディングは、レイトバインディングとも呼ばれます。 Objective-Cでは、すべてのメソッドが実行時に動的に解決されます。実行される正確なコードは、メソッド名(セレクター)と受信オブジェクトの両方によって決まります。
動的結合は多型を可能にする。たとえば、Dog、Athlete、ComputerSimulationなどのオブジェクトのコレクションを考えてみましょう。各オブジェクトには、独自のrunメソッドの実装があります。以下のコード断片では、[anObject run]という式で実行されるべき実際のコードは実行時に決定されます。ランタイムシステムは、メソッド実行のセレクタを使用して、anObjectのクラスが何であるかにかかわらず、適切なメソッドを識別します。
NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil];
id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)];
[anObject run];
あなたはJavascriptに精通している場合は、客観Cでの動的型付けはかなり類似した「varは」この変数の実際の型は、実行時に、それはだ一度に把握することになるのJavascript、であるものにです割り当てられた。それは、あなたが実行時に保持しているオブジェクトの型が「認識できないセレクタ」の実行時例外を介して可能であるかどうかわからない場合には、再利用して再入力することができます。 Objective-Cでは、すべてのオブジェクトがid型であるため、id型の変数を動的型定義に使用できます。
オブジェクトの動的バインドは、実行時に呼び出されるオブジェクトの型に基づいて適切なメソッドが呼び出される「ポリモーフィック」動作です。
私はそれがの
- 1. C#の静的変数と動的変数の違いは何ですか?
- 2. 動的タイピング言語のドキュメント
- 3. 静的バインディングと動的バインディング - 違いは何ですか?
- 4. C++とObjective Cの "静的"の意味の違いは何ですか?
- 5. 動的UIApplicationShortcutItems(Objective-C)のサンプルコード
- 6. 動的メソッドと仮想メソッドの違いは何ですか?
- 7. Objective-Cでの動的クラスの作成
- 8. Objective-Cでの静的変数宣言の違いは何ですか?
- 9. C#代理人、動的プロキシ、クロージャ、関数ポインタの違いは何ですか?
- 10. 春の自動動的バインド
- 11. 動的ファイルへのリンクと入力オブジェクトとの違いは何ですか?
- 12. バインドは動的に
- 13. 実行時のObjective-C動的プロパティ
- 14. Objective-Cの動的メソッド呼び出し
- 15. Perlでの語彙スコープと動的スコープの違いは何ですか?
- 16. CoffeeKupの動的バインド
- 17. XAMGridの動的バインド
- 18. Objective-Cの "_"と "__"の違いは何ですか?
- 19. Objective Cのメソッドと+メソッドの違いは何ですか?
- 20. objective-cの[myString length]とmyString.lengthの違いは何ですか?
- 21. Objective-CのinstancesRespondToSelectorとrespondsToSelectorの違いは何ですか?
- 22. ハイブの動的パーティションと静的パーティションのベストプラクティスは何ですか?
- 23. C++で初期(静的)バインディングと遅延(動的)バインディングとは何ですか?
- 24. Xの動的配列のDelphi動的配列のメモリレイアウトとは何ですか?
- 25. C++のテンプレートパラメータと部分的な特殊化:強タイピングですか?
- 26. 動的タイピングバグとは何ですか?
- 27. この演習では、静的スコープと動的スコープの違いは何ですか?
- 28. Objective-Cにインポートとインクルードの違いは何ですか?
- 29. DataGridView comboboxcolumn動的バインド
- 30. Objective-Cでプロトコルを動的に実装することは可能ですか?
可能重複役に立てば幸い[Objective-Cのは、動的バインディングを使用しますが、どのように?](http://stackoverflow.com/questions/1697093/objective-c-uses-dynamic-binding-but -how) –
@リチャード - 反対。 OPは動的バインディングと動的タイピングの違いについて質問しています。あなたが言及した質問は、動的な型付けにはまったく対応していません。 – jlehr