5

[NSString stringWithFormat]メソッドが型を返すのはなぜidですか?私が期待している名前からNSString、一般的なポインタではなく、が返されます。他のクラスはこの「ルール」に従います。たとえば、ではなく、を[NSNumber numberWithInt]返します。NSNumberid

ファクトリメソッドのようなものであるという事実からも正当化されていないと思います。

4

2 に答える 2

6

あなたが言うNSNumberには、これには直接のサブクラスがないのでnumberWithInt:NSNumber*

NSString*(およびなどの他のクラス)は、このメソッドを継承するサブクラス(およびそれぞれ)を持つことができるため、NSSetタイプを返します。そのため、これらの継承された呼び出しはサブクラスの型のインスタンスを返す必要があり、メソッドの命名規則により、戻り型のみに基づいてオーバーロードすることはできません。そのため、それらすべてに共通のタイプ、つまり。が必要です。idNSMutableStringNSMutableSetid

更新:最近の開発は、キーワードinstancetypeが利用可能になったことを意味します。idへの参照の多くがに置き換えられていることに気付いたかもしれませんinstancetype。このキーワードは、メソッドの戻り型がメソッドのレシーバーと同じクラスであるというヒントをコンパイラーに提供します。

たとえば(そして私は例を強調しますが、これは実際のフレームワークには当てはまらないかもしれません):

NSArray:
- (instancetype)initWithArray:(NSArray*)array;

NSMutableArray:
// Inherits from NSArray

----

// Receiver is NSArray, method belongs in NSArray, returns an NSArray
[[NSArray alloc] initWithArray:@[]];

// Receiver is NSMutableArray, method belongs in NSArray, returns an NSMutableArray
[[NSMutableArray alloc] initWithArray:@[]];
于 2012-11-07T21:59:56.127 に答える
5

これはクラスNSStringの静的メソッドであり、呼び出されているオブジェクトのタイプを返すと想定されているためです。これはNSMutableStringから取得できるため、これもタイプによって異なります。

于 2012-11-07T21:55:39.673 に答える