2010-12-19 10 views
0

次のようにコードを参照してください:次のようにどのようにポインタを渡し、関数の結果を得ましたか?

- (BOOL)postAction :(NSString*) url params:(NSDictionary*) params bodySize:(NSNumber**)bodySize 
{ 
... 
int size = 1999; 

NSNumber* value =[[NSNumber alloc] initWithInt:size]; 


bodySize = &value; 


...} 

は、関数を使用します。

NSNumber* size ; 
[self postAction:@"http://webserver/ss.php" params:params bodySize:&size]; 



// can not got the size value at all… 


int i = [size intValue]; 
//will throw nil exception ! 

私の質問は、どのように上記のコードを修正することですか?

ご協力いただきありがとうございます。

よろしく

+2

あなたはそれが代わりに 'NSNumber'オブジェクトを返すようにできませんか? – BoltClock

+0

すでに見たことがあるかどうかは分かりませんが、このようなメソッドを作成している場合は、簡単にデータを投稿できる無料のASIHttpRequestライブラリ(実際にはかなりクラス)を見てください。 –

答えて

1

私はあなたがこれをしたいと思う:

//bodySize = &value; 
*bodySize = value; 
+1

おそらくそうではありません。参照渡しは非常にまれにしか正しく書かれていないiOSアプリです。 – bbum

+0

@bbumそれは間違っています。リンゴのコード全体では、 'NSError'は' NSScanner'を使って参照するだけでなく、他のインスタンスにも渡されます。 –

+0

はい。それは、まれな、特定の、ユースケースです...私が "希少な"と言ったとき、私は "このパターンは非常にまれです"という意味ではなく、一度決定したパターンでは、フレームワークAPI全体で、何十分の1から何十倍もの他の*の参照が渡されていますか? (コメントありがとう、確かに説明があった)。 – bbum

2

理想的には、あなたは常にそれを逆参照する前にポインタをチェックする必要があります:

If (bodySize) 
    *bodySize = value; 
0

は、私は上記の2つの答えに同意します。より明確にするために、NSNumberはオブジェクトです(NSIntegerまたはNSUIntegerとは異なります)。ポインタをそのオブジェクトに直接指す必要があります。

4

iOSまたはMac OS Xで参照渡しを使用している場合、間違っている可能性があります。

真剣に - 参照渡しは非常にまれなパターンです。 API全体で(NSError**)にほぼ完全に予約されています。

参照渡しを使用する理由はありませんが、これはそうではありません。

具体的には、NSNumberを返す必要がある場合は、返品してください。その方法はnilを返す場合

- (NSNumber *) foo; 

は、それがBOOLNOを返すと同じくらい良いです。そして、それはNSErrorを使用しての非常に一般的なパターンに従うためにあなたを設定しています

- (NSNumber *) foo: (NSError **) error; 
関連する問題