ObjectiveCeeds › iOS 7: Der neue Typ - instancetype

iOS 7: Der neue Typ - instancetype

Von Manfred Kreß

Seite 1 von 1



Relativ unbemerkt von den meisten, ist in letzter Zeit ein neuer Objective-C Typ aufgetaucht: instancetype. In Zukunft wird von diesem Typ allerdings rege Gebrauch gemacht. Was hat es damit auf sich.

Der Typ "instancetype" taucht schon in iOS 6 z.B. in der Klasse UICollectionViewLayoutAttributes auf. In iOS 7 werden viele Methoden die einen id Typ zurückgaben, durch instancetype ersetzt. Bevor ich nun erkläre, was es mit instancetype auf sich hat, komme ich auf unseren "Objective-C Universalpointer" id zurück. id ist ein beliebiges Objective-C Objekt. Zur Runtime gibt es quasi nur id - Pointer auf ein Objekt im Speicher. Nun gibt es viele Klassen, die als Rückgabewert den Typ id haben, meist in sogennannten Factorymethoden, Methoden zur Objekterzeugung. Bekannter Vertreter ist z.B. die Methode init von NSObject. Der zurückgegebene typ ist id. Alle Klassen überschreiben die init Methode von NSObject, NSArray gibt ein NSArray zurück, NSDictionary ein NSDictionary usw. Der Compiler kann nicht wissen, was für ein Typ zurückgegeben wird, es ist alles id.
NSArray *a = [[NSObject alloc] init];
Das ist eigentlich problemlos möglich. "Ja was hat er denn, der Compiler spuckt doch eine Warnung aus…"
Incompatible pointer types initializing 'NSArray *__strong' with an expression of type 'NSObject *'
Richtig, aber das ist ein Sonderfall! Xcode stellt über lexikarische Analyse des Quellcodes fest, das hier ein alloc - init Double ist und generiert darüber eine Warnung. Aber das ist wirklich ein Sonderfall. Sobald wir das alloc - init double nicht benutzen, ist Xcode aus dem Spiel:
NSArray *a = [NSDictionary dictionary];
NSLog(@"array %lu", (unsigned long)[a indexOfObject: self]);
Das wird jetzt von Compiler problemlos geschluckt, keine Warnung. Aber beim Log geht es natürlich schief, a ist ein Dictionary und das kennt diese Methode nicht. [NSDictionary dictionary] gibt den Typ id zurück, somit ist das für den Compiler völlig in Ordnung. Anderes Beispiel:
NSMutableArray *a = [NSArray array];
[a addObject: self];
Das kann schon mal passieren. NSArray implementiert die Methode array, NSMutableArray überschreibt sie und liefert die mutable Variante zurück. Rückgabetyp ist id. Keine Beschwerde des Compilers - aber addObject: crashed natürlich zur Laufzeit. Und hier kommt instancetype ins Spiel. instancetype ist ein Rückgabetyp und besagt, das das hier zurückgegebene Objekt vom gleichen Typ ist, wie das Objekt bzw. die Klasse bei dem oder der die Methode aufgerufen wird. Aus:
+ (id) array;
wurde in iOS 7:
+ (instancetype) array;
Und damit kann der Compiler unterscheiden, ob ein Array oder ein MutableArray zurückgegeben wird. Er generiert eine Warnung und die Falle ist entschärft. instancetype ist nicht wirklich ein neues Feature von iOS 7. Es ist schon länger vorhanden, wird aber jetzt konsequent genutzt. Möglich wurde instancetype durch den LLVM Compiler, der bessere Möglichkeiten zur Codeanalyse bietet, als die reine lexikarische Untersuchung des Quellcodes. Und so wurde Objective-C (clang) um instancetype erweitert - nicht iOS 7. Für uns als Entwickler wird sich nicht viel ändern, außer das Xcode unsere Bugs besser findet. In Zukunft sollten wir einfach darauf achten, auch in unseren eigenen Erzeugermethoden instancetype zu verwenden.


Seite: 1 von 1


iOS 7: Der neue Typ - instancetype