2011-12-06 1 views
3

私はいくつかのライブラリコードを書いています。ライブラリのユーザは、intを使うべきメソッドとNSNumberを使うべきかについて、異なる意見を持っていることがあります。私はintとNSNumberの間で複数のディスパッチを行うことはできますか?

[myObject myMethod:5]; 

または

[myObject myMethod:[NSNumber numberWithInt:5]] 
のいずれかが同じように動作

ようにする方法を設定するにはいくつかの方法をしたいと思います。 Javaでは、自動ボクシングはこれを比較的簡単にしますが、これを目的で実行する方法は認識していません。この仕事をすることは可能ですか?

答えて

4

短い回答:いいえ。

Objective-Cは、C++のように関数/メソッドのオーバーロードをサポートしていません。

通常、異なるデータ型をサポートする必要がある場合は、別個のメソッドを作成します。
渡された値を自分自身に変換できるので、同じコードを記述(コピー/貼り付け)する必要はありません。例えば

- (void)methodWithInt: (int)val 
{ 
    [ self methodWithNumber: [ NSNumber numberWithInt: val ] ]; 
} 

- (void)methodWithLong: (long)val 
{ 
    [ self methodWithNumber: [ NSNumber numberWithLong: val ] ]; 
} 

- (void)methodWithNumber: (NSNumber *)num 
{ 
    /* Effective code */ 
} 

終わりには、すべてがmethodWithNumber方法にリダイレクトされます。

+0

最終的にはあなたがあなたの番号で何をしているのかによって異なりますが、一般的には、すべてのものを 'methodWithInt:'に集めるようになっています。 – livingtech

+0

methodWith *何百万回も呼び出す必要がある場合、methodWithIntは10倍高速(またはそれ以上)になる可能性があり、オートリリースプールに100万個のNSNumbersを落とさない可能性があります。だから、intがいつもどんなものか確かめていれば、ライブラリとしてどのように呼び出されるのかわからないので、methodWithIntの方に傾いていなければなりません。呼び出し元が自動リースされたNSNumberを使用していた場合、百万回の呼び出しでNSNumberのメモリフットプリントは約12 MB程度になります。 –

1

いいえObj-Cには自動ボクシングまたはメソッドのオーバーロードはありません。

Obj-Cには自動ボクシング/アンボクシングを実行する機能がありますが、これはKey-Value Codingですが、このような状況では適切ではありません。

関連する問題