1

ココアの開発者になるために面接する人のために、面接の質問のリストをまとめています。私はプログラマーですが、Objective-Cを実行したことはありません。動的型付けに関する興味深い質問に出くわしました。初歩的なはずです。試してコンパイルしましたが、どのように、なぜ機能するのかはまだわかりません。

質問は

次の手順を実行すると、コンパイル時と実行時に何が起こりますか。

NSString *s = [NSNumber numberWithInt:3];
int i = [s intValue];

デバッガーで

i =(int)3
s =(__NSFCNumber *)0x383(無効なアドレス)

の出力はNSLog(@"%d",i)、、3の出力はNSLog(@"%@",s)です3

誰かが、私がObjective-CとCocoaに完全に慣れていないが、コンピュータサイエンスにはまったく慣れていないことを念頭に置いて、コンパイラとランタイムシステムによってこれらすべてがどのように処理されるかについて説明してもらえますか?

4

3 に答える 3

3

sは、NSNumberオブジェクト(aへのポインタ)が割り当てられる単なる標準のCポインタです。

NSNumber、および、NSStringに応答しintValueます。それについてです。

于 2011-10-05T16:23:12.320 に答える
3

sNSStringオブジェクトを指すと宣言したポインタです。何でも指すことができますが、理想的にはNSStringを指す必要があります。ただし、コードサンプルはsNSNumberオブジェクトを指しています。

メソッドを送信するだけであれば、すべてに応答するsメソッドでNSNumber問題ありません(コンパイラの警告を除く)。NSNumberが指すオブジェクトにNSStringメソッドを送信しようとしてもs、NSNumberが応答しない場合は、例外が発生します。オブジェクトに一致するセレクターシグニチャーがある場合(つまり、:) @selector(intValue)、メソッドが呼び出されます。

于 2011-10-05T16:23:40.743 に答える
3

変数"s"のNSStringの宣言は、コンパイラーが変数"s"の意図を解釈するのを支援するためだけに行われます。これにより、特定のタイプの変数を使用するつもりであったが、誤って別のタイプの変数を割り当てた場合に、コンパイラーが静的タイプチェックを実施できます。ObjCでは、変数は任意のオブジェクトを指すことができますが、ブラケット構文はオブジェクトに「メッセージ」を送信する手段です。メッセージを送信すると、メッセージを実装する関数を検索するコードを生成するようにコンパイラーに指示されます。また、ObjectiveCでは、メッセージはセレクターと呼ばれます。(低レベルの詳細は少し複雑ですが、高レベルではそのように機能します。)これは動的typicの動的な部分であり、「ダックタイピング」とも呼ばれます。アイデアは、それがアヒルのように見える場合、あなたはそれをアヒルのように震わせることができるはずです。本質的に、特定の形状に従うオブジェクトは、その形状に適合するタイプに割り当てることができます。

次のことを考慮してください。

Dog *myPuppy = [[Cat alloc] init] autorelease];
[myPuppy walk];
Food *preparedDish = [self prepareMealForPet];
[myPuppy eat: preparedDish];

コンパイラはここであなたにフラグを立て、あなたが犬と一緒に時間を過ごすつもりであったが、実際には猫を扱っていることを示します。しかし、猫は犬に似た形をしていて、歩いたり、惣菜を食べたりできるので、完全に有効です。ダックタイピングでは、事前に知られていないタイプの変数を受け入れる必要がある場合が多いため、これを回避できます。さらに、イントロスペクションを通じて、実行時にオブジェクトの形状を見つけることができます。子犬に吠えるように頼みたい場合は、上記のコードで検討してください。例外が発生し、アプリがクラッシュします。ただし、クラッシュを回避するために、イントロスペクションを使用して、オブジェクトが「樹皮」メッセージに応答するかどうかを確認できます。

if([myPuppy respondsToSelector:@selector(bark)]) {
   [myPuppy bark];
}
于 2011-10-05T16:42:55.063 に答える