2012-02-20 19 views
13

私はObjective Cの動的バインドと動的タイピングの違いを理解するのに苦労しています。Objective Cの動的バインドと動的タイピングの違いは何ですか

+0

可能重複役に立てば幸い[Objective-Cのは、動的バインディングを使用しますが、どのように?](http://stackoverflow.com/questions/1697093/objective-c-uses-dynamic-binding-but -how) –

+1

@リチャード - 反対。 OPは動的バインディングと動的タイピングの違いについて質問しています。あなたが言及した質問は、動的な型付けにはまったく対応していません。 – jlehr

答えて

27

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] 

結果は、例えば、fooNSArrayのインスタンスではなくNSStringのインスタンスです。

6

動的タイピングでは、任意のタイプのオブジェクトを格納できるid型の変数を持つことができます。動的バインディングでは、id obj; [obj doWhatever];とを実装するタイプのobjであれば動作します。

2

ダイナミック

アップルのドキュメントからオブジェクトの種類、それが指すがコンパイル時にチェックされていない場合、変数は動的型付けされ

を入力します。 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]; 
0

あなたはJavascriptに精通している場合は、客観Cでの動的型付けはかなり類似した「varは」この変数の実際の型は、実行時に、それはだ一度に把握することになるのJavascript、であるものにです割り当てられた。それは、あなたが実行時に保持しているオブジェクトの型が「認識できないセレクタ」の実行時例外を介して可能であるかどうかわからない場合には、再利用して再入力することができます。 Objective-Cでは、すべてのオブジェクトがid型であるため、id型の変数を動的型定義に使用できます。

オブジェクトの動的バインドは、実行時に呼び出されるオブジェクトの型に基づいて適切なメソッドが呼び出される「ポリモーフィック」動作です。

私はそれがの

関連する問題