2012-11-07 25 views
5

Warum gibt die Methode [NSString stringWithFormat] einen id Typ zurück? Von dem Namen, den ich erwarte, gibt es einen NSString, keinen generischen Zeiger zurück. Andere Klassen folgen dieser "Regel". Zum Beispiel gibt [NSNumber numberWithInt] eine NSNumber zurück, keine id.NSString StringWithFormat Rückgabetyp, warum ist es "id"?

Ich denke, es ist nicht einmal aus der Tatsache gerechtfertigt, dass es so etwas wie eine Fabrik-Methode ist.

+1

Für Subklassifizieren. 'NSMutableString' würde in diesem Fall eine Umwandlung erfordern. –

+0

Ja, ich stimme dir zu - du kannst einen Stepptanz machen, warum das so ist, aber letztendlich ergibt das keinen Sinn. –

Antwort

6

Sie NSNumber erwähnen, doch hat dies keine direkten Unterklassen hat, ist es so sicher für numberWithInt: eine idNSNumber*

NSString* (und andere Klassen wie NSSet) Rückgabetyp zurück, weil sie Unterklassen haben können (NSMutableString und NSMutableSet), die diese Methode erben wird. Daher müssen diese geerbten Aufrufe eine Instanz des Unterklasse-Typs zurückgeben, und aufgrund der Regeln der Methodennamensgebung können Sie basierend auf dem Rückgabetyp nicht überladen. Als solche benötigen sie einen gemeinsamen Typ zwischen allen, der id ist.

Update: Neuere Entwicklungen bedeuten, dass das Schlüsselwort instancetype jetzt verfügbar ist. Sie haben vielleicht bemerkt, dass viele Referenzen auf id jetzt durch instancetype ersetzt werden. Dieses Schlüsselwort gibt dem Compiler einen Hinweis, dass der Rückgabetyp der Methode dieselbe Klasse des Empfängers der Methode ist.

Zum Beispiel (und ich betone ein Beispiel, kann dies nicht der Fall, in dem eigentlichen Rahmen sein):

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:@[]]; 
+0

Ok, ich hätte nie gedacht, dass ich [NSMutableString stringWithFormat] aufrufen könnte. Normalerweise habe ich einen leeren NSMutableString erstellt und dann Formate angehängt. Mein Verständnis der Klassenhierarchie ist von der Java-Erfahrung abhängig, wobei String keine Super-Klasse von StringBuilder ist. – giampaolo

+0

Die veränderbare Version einer Klasse ist immer eine Unterklasse des konkreten Gegenstücks. Es macht Sinn für Cocoa, die veränderbare Klasse ist identisch mit der konkreten, mit ein paar Schnickschnack hinzugefügt, um es zu ermöglichen, gelesen zu werden, anstatt nur zu lesen :) – WDUK

+0

@WDUK ist wählerisch, 'NSNumber' ist ein Klassencluster, also Es hat viele Unterklassen, nur sie sind privat. –

5

Da es eine statische Methode für die Klasse NSString ist und angenommen wird, dass der Typ des aufgerufenen Objekts zurückgegeben wird. Dies hängt auch vom Typ ab, da dieser von einem NSMutableString stammen kann.

Verwandte Themen