2011-08-12 7 views
2

誰かがこの2つのスニペットの違いを明らかにするでしょうか?私はこれを知っているこのObjective-C構文の意味は何ですか?

は、インスタンス化したものです:

Class *myClass = [[Class alloc] init] ....etc 

が、まさにこれを何ですか?

(Class *)myClass .....etc 

あなたが言うように感謝

答えて

1

最初の1、与えられた正しい構文は、インスタンス化されます。

もう1つは、変数 "myClass"をClassオブジェクトのインスタンスへのポインタにキャストしています。

2

2番目のスニペットは、キャストまたはメソッドのパラメータのいずれかです。インスタンス化とは何の関係もありません。

メソッド宣言で(Class *)myClassが発生した場合は、メソッドのパラメータの型を定義するだけです。たとえば、- (void) method:(Class *)myClassは、voidを返し、タイプClass*の1つの引数を取るメソッドです。

(Class *)myClassが他のコードで発生した場合、それはキャストです。基本的には、タイプClassのオブジェクトへのポインタとして、myClassを実際のタイプに関係なく再解釈すると言います。数字付きのキャストのようなものです。がintの場合、(float)xfloatとキャストして浮動小数点演算で使用できます。

一般的に言えば、Objective-Cオブジェクトで大量にキャストを使用しないように注意してください。 1つの場所は、このようなものを表示します。(CFURLRef)[NSURL fileURLWithPath:path]のように、NSオブジェクトをCFオブジェクトにキャストすることです。しかし、ほとんどの場合、異なるタイプのオブジェクトは適切にキャストされません。

また、最初のスニペットにエラーがあります。実際には[[Class alloc] init]になります。 allocに電話をしてからinitに電話する必要があります。 [init]は意味がありません。Objective-Cの構文はまったく適合しません。

0

2番目のスニペットはCスタイルのキャストです。これは、宣言された型にかかわらず、クラス*の値としてmyClassを扱うようにコンパイラに効果的に指示します。残りのスニペット(および前のmyClassの宣言)がなければ、なぜあなたがキャストを使用したいのか、それがどのような効果を持つのかを言うことは不可能です。

関連する問題