2010-11-23 12 views
0

間違ったポインタ型を関数に渡すことについての警告がよく出てきます。newbie objective c pointer question "*" syntax

これら2つの違いは何ですか?

CFURLRef *ref=(CFURLRef *)sourceURLArray[0]; 

CFURLRef ref=(CFURLRef)sourceURLArray[0]; 

最初の配列は実際に配列内のオブジェクトのメモリアドレスを参照していますか? もう1人はコピーを作成していますか?

私が今追求しているコードの主なスタイルは、値やオブジェクトの配列を持つことです。私は、元の値を変更することなく、これらの値を他の関数に渡したいと思っています。

私が試した2つの関数の宣言は、次のとおりです。

- (void) loadAudioFileIntoMemory:(CFURLRef *)address channel:(int) value row:(int) value2; 

- (void) loadAudioFileIntoMemory:(CFURLRef)address channel:(int) value row:(int) value2; 

どのような違いがありますか?

答えて

5

CFURLRefはすでにポインタである - それはdeclaredのようだ:一般的に

typedef const struct __CFURL *CFURLRef; 

、あなたがURLを保持する変数を宣言するとき*なしタイプCFURLRefを使用したいと思うでしょう。 Core Foundationオブジェクトの大半(またはすべて)はこのように定義され、Refで終わるタイプをポインタと見なすことができます。多分少し混乱これはObjective-Cの対応、NSURLは、のに*を必要としないということである作る何

CFURLRef sourceURLArray[10]; 
//... populate the array. 
// Get a particular URL out of the array: 
CFURLRef ref = sourceURLArray[0]; 

:あなたは10のURLの配列をしたい場合は

だから、あなたは次のように書きますすべてのCocoaオブジェクトと同様にポインタにします。最後に、あなたはそれが簡単にプレーンなC配列を使用するよりもNSArrayNSURLのオブジェクトを使用することを見つけるかもしれない

NSURL *sourceURLArray[10]; 
... 
NSURL *url = sourceURLArray[0]; 

:だからあなたのような何かを書きたい

NSArray *sourceURLs = [NSArray arrayWithObjects:...]; 
NSURL *url = [sourceURLs objectAtIndex:0]; 
+1

優秀な答えを、ダニエルを。このような状況で一般的に役立つ小さなヒントがあります。あなたが慣れていない記号(データ型、定数、変数など)に遭遇した場合は、XcodeエディタでCommandキーをダブルクリックすると、記号の定義にまっすぐジャンプします。 – jlehr