Ich bin daran interessiert, die Speichergröße zu kennen und einige Objective-C-Objekte zuzuweisen.
Zum Beispiel:
Ist [NSString stringWithString:@"2"]
größer als [NSNumber numberWithInt:2]
oder nicht?
Und wie viel größer ist [NSNumber numberWithInt:2]
als int num=2
?
Gibt es zu dieser Frage eine Dokumentation von Apple? Ich denke, dass diese Information sehr wichtig für die Speicheroptimierung ist.
Eine genaue Dokumentation ist nach meinem besten Wissen nicht verfügbar. NSString und (IIRC) NSNumber werden als Klassencluster implementiert, d. H. Wenn Sie nach einem neuen Objekt fragen, erhalten möglicherweise ein Objekt einer undokumentierten Unterklasse.
Es bedeutet auch, dass sich die Dinge ohne Vorwarnung ändern können, wenn Ihr Programm unter einer anderen Betriebssystemversion läuft, also verlassen Sie sich nicht auf genaue Zahlen.
Nun, lassen Sie uns eine grobe Schätzung versuchen. Ganzzahlen sind 4 Byte auf allen aktuellen Apple-Plattformen. Zeiger sind 4 Bytes auf iOS.
Objekte werden auf dem Heap zugewiesen; Auf der untersten Ebene erfolgt die Heap-Zuweisung durch malloc
.
Ich gehe davon aus, dass die malloc-Implementierung von iOS von der auf Mac OS verwendeten abgeleitet wurde - Sehen Sie hier einige Details: Ссылка
Der wichtigste Punkt ist, dass das Zuweisungsquantum für kleine Objekte 16 Byte ist, d. h. kleine Objekte werden ein Vielfaches von 16 Byte verbrauchen.
Jedes Objective-C-Objekt enthält einen Zeiger auf seine Klasse.
Also würde ich für eine NSNummer, die ein int enthält, 4 Bytes für Ihren Zeiger schätzen, plus 16 Bytes für das Objekt (bestehend aus einem 4-Byte-Klassenzeiger und - ich denke - einem 4-Byte-int plus 8 Bytes verschwendeter Raum).
Für einen NSString gibt es verschiedene konkrete Unterklassen für verschiedene Situationen. Ein String-Literal @"2"
zeigt auf ein statisch zugewiesenes String-Literal-Objekt, eine zur Laufzeit erstellte Zeichenfolge wird wahrscheinlich eine andere Darstellung haben.
Im Allgemeinen würde ich 4 Bytes (Ihr Zeiger) + 16 Bytes (das NSString-Objekt) + Anzahl der Zeichen * 2 (sizeof (unichar)) auf ein Vielfaches von 16 aufgerundet raten.
Zusammenfassend schätze ich , dass NSNumbers
ungefähr fünfmal mehr Speicher benötigt als int
s. Ich schätze weiter, dass dieselbe Zahl, die als NSString
dargestellt wird, ungefähr 10 mal mehr Speicher benötigt als int
.
Beachten Sie auch, dass das Zuordnen von objective-C-Objekten viel langsamer ist als das Definieren einer lokalen Variablen vom Typ int. Sie sollten jedoch auch daran denken, dass es oft nicht wichtig ist und dass vorzeitige Optimierung die Wurzel allen Übels ist .
Es gibt nicht so etwas wie NSString
oder NSNumber
, die Logik von ihnen ist tatsächlich in mehreren verschiedenen Klassen implementiert, von denen jede mehr oder weniger ihren eigenen Speicherbedarf hat. Es ist also unmöglich zu sagen, wie viel eine Klasse vor der Laufzeit gewichtet (Sie können jedoch die ObjC-Laufzeit dazu fragen).
Das heißt, eine andere Sache ist, dass [NSNumber numberWithInt:2]
höchstwahrscheinlich eine Singleton-Instanz von NSNumber
zurückgibt (afair jede ganze Zahl bis 12 ist zwischengespeichert), so dass Sie nicht wirklich etwas zu Ihrem Speicherbedarf hinzufügen.
Und neben all dem ist der Weg zur Optimierung Ihres Gedächtnisses der falsche Weg! Wenn ein Objekt 64 Bytes mehr wiegt als das andere, na und? 64 Bytes sind nichts, sogar auf einem iPhone! Sie werden mit größeren Speicherproblemen enden, wo Sie tatsächlich optimieren können, z. durch faulen Laden deiner Sachen oder was auch immer. Aber diese Probleme werden beim Testen mit Instrumenten gefunden und nicht beim Schreiben Ihres Codes! (Sie wären überrascht, wie oft eine einfache "Optimierung", die vor dem Testlauf durchgeführt wurde, entweder keinen Effekt hat oder sogar eine schlechtere Auswirkung auf die Leistung hat!)
Sehen Sie sich Instrumente an. Diese Tools sollten in der Lage sein, Ihre Fragen zu beantworten.
Tags und Links iphone ios memory-management