Zwei-Schritt-Initialisierung ermöglicht uns, diese Art von Dingen zu tun (nämlich eine Instanz einer Klasse für eine andere zu ersetzen, abhängig von dem aufgerufenen Initialisierer). Klassencluster in Foundation und UIKit nutzen dies, um Instanzen zurückzugeben, die für einen bestimmten Anwendungsfall optimiert sind. Zum Beispiel ist UIColor
selbst nur eine Schnittstelle für seine Unterklassen, die Farb-Caching implementiert (alle benannten Initialisierer wie +blackColor
), den RGB-Farbraum ( +colorWithRed:green:blue:alpha
), den Schwarz-Weiß-Farbraum ( +colorWithWhite:alpha:
) , CIColor
Kompatibilität usw. Und so NSDate
ist auch. Wenn Sie -init
aufrufen, hat Apple Mittel und Motiv, ein anderes Objekt zurückzugeben, das die gleiche Schnittstelle wie NSDate
als Optimierung implementiert, weil es Ihnen ehrlich gesagt egal ist, was Sie bekommen, solange es die Raketen nicht startet Sie versuchen, es richtig zu melden.
Ab dem letzten iOS SDK gibt der Aufruf von [NSDate alloc]
immer den gleichen Speicherort zurück. Sie können dieses Verhalten mit dem folgenden Code überprüfen:
Ich vermute, dass es damit zu tun hat, dass NSDate
ein Klassencluster .
Wenn die privaten Unterklassen eines Klassenclusters unterschiedliche Speicheranforderungen haben, ist es unmöglich, innerhalb von alloc
zu wissen, wie viel Speicher zuzuweisen ist. Ein Ansatz zur Lösung dieses Problems, und dies scheint der Ansatz zu sein, den Apple mit NSDate
verwendet, besteht darin, dass die Methoden init
und factory die gesamte Speicherzuweisung verarbeiten, da diese Methoden wissen, welche private Unterklasse tatsächlich verwendet wird verwendet werden.
An diesem Punkt ermöglicht es alloc
Ihnen, dass Sie das [[NSDate alloc] init]
-Muster beibehalten können, das überall in Objective-C für die Objekterstellung verwendet wird. Da der Speicherplatz, der von alloc
zurückgegeben wird, immer verworfen wird, kann auch alloc
genau einen festen Speicherplatz zurückgeben, was er zu tun scheint.
Tags und Links objective-c foundation