Alloc + Init Speicherverwendungsmechanismus

8

Ich bin nur neugierig zu wissen, wann ein Objekt von alloc erstellt wurde, und ein Stück Speicher, der ihm zugewiesen wurde, warum init dieses Stück Speicher nicht verwendet und die Adresse des Objekts ändert?

%Vor%     
Hadi 22.12.2013, 11:52
quelle

2 Antworten

1

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.

    
CodaFi 22.12.2013, 17:39
quelle
1

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:

%Vor%

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.

    
godel9 22.12.2013 19:05
quelle

Tags und Links