Wenn ich mein Objekt zu einer Unterklasse von UIViewController mache, verwendet es wesentlich mehr Speicher als wenn es eine Unterklasse von NSObject ist? Eine Ballpark-Figur für wie viel mehr Overhead verwendet wird, indem eine komplexe Klasse gegenüber einer einfachen Klasse subklassifiziert wird, wäre groß. edit: oder eine Möglichkeit, den Unterschied selbst herauszufinden.Haben alle Objekte einen ähnlich großen Speicher? Objective-c
Antwort
können Sie, dass ein Objective-c-Objekt ist nur eine C-Struktur, die wie folgt aussieht:
typedef struct {
Class isa;
} NSObject;
Eine Instanz dieser Struktur würde 4 Byte auf einem 32-Bit-System. Da es aus einem einzigen Zeiger besteht - Klasse ist ähnlich wie ID.
Eine Unterklasse von NSObject, MySubClass mit einer ‚char‘ Instanzvariable würde wie folgt aussehen:
typedef struct {
Class isa;
char singleInstanceVariable.
} MySubclass;
Eine Unterklasse hat einfach alle die Instanzvariablen der Superklasse am Anfang, plus sein eigener an das Ende. Sie können dies im Debugger sehen, indem Sie in der Konsole 'p * object' eingeben.
MySubclass Größe wäre 5 Bytes auf einem 32-Bit-System. Ein Zeiger und ein Zeichen. Die Größe eines Objekts ist also die Größe aller Instanzvariablen, die zusammengefügt werden. Eine wichtige Sache zu wissen ist, dass die Größe eines Objekts nur auf seine Instanzvariablen bezogen ist. Es ist nicht von der Anzahl der Methoden betroffen. Diese Methoden kosten keinen zusätzlichen Speicher, da mehr Instanzen instanziiert werden. Methoden haben feste Anfangskosten.
Eine andere Sache zu berücksichtigen ist, dass Objekte in der Regel Zeiger auf andere Objekte als Instanzvariablen haben. Angenommen, jede UIView verfügt über ein NSMutableArray, um auf ihre Untersichten zu verweisen. Dieses Array könnte 12 Bytes lang sein, wenn es leer ist. Eine leere UIView wäre also die Größe aller Variablen in einer UIView, die 4 Bytes für den Zeiger auf ein Array enthalten würde, und Sie könnten auch die 12 zusätzlichen Bytes berücksichtigen, die von der tatsächlichen Array-Instanz verwendet werden. Das ist alles nur Accounting, obwohl das Array und die Ansicht zwei verschiedene Objekte sind, aber die Ansicht ist nicht wirklich ohne das Array verwendbar.
Schließlich werden die meisten Zuordnungen auf ein gewisses Quantum aufgerundet, um die malloc-Implementierung schneller zu machen und einige Einschränkungen der Architektur der Maschine zu erfüllen, so dass Zeiger richtig ausgerichtet sind. Auch die Instanzvariablen eines Objekts können eine leere Füllung dazwischen haben, ähnlich wie structure padding
Das hängt von der Anzahl und der Art der Instanzvariablen der Superklasse ab. NSObject
hat einen ivar, den isa
Zeiger. UIViewController
hat etwa 30 Ivars, die meisten davon Zeiger (Sie können die Liste in UIViewController.h
suchen).
So jede Unterklasse von UIViewController
wird so viel Speicher benötigen wie alle diese ivars speichern benötigt wird und alle ivars ihrer Ober (UIResponder
(keine ivars) und NSObject
(ein Ivar)).
Diese Berechnung berücksichtigt nicht den tatsächlichen Speicher, der von den Objekten verwendet wird, auf die diese Instanzvariablen bei der Initialisierung verweisen. Zum Beispiel kann ein vollständig initialisierter View-Controller ein View-Objekt festhalten, das eine beträchtliche Menge an Speicher belegt.
Kurz gesagt, ja, aber wahrscheinlich nicht genug, dass Sie sich darum kümmern müssen, es sei denn, Sie planen, Dutzende von ihnen instanziieren.
Das Objekt reserviert Speicher für jede seiner Ivars und Methoden. Die benötigte Speichermenge hängt von den C-Typen ab ... sie variieren alle entsprechend dem Datentyp, der gespeichert wird.
Die Größe des verwendeten Speichers hängt davon ab, wie das Objekt instanziiert, auf dem Bildschirm dargestellt und mit ihm interagiert wird. Zum Beispiel hat eine Unterklasse von NSObject keine Interaktion mit den Berührungen des Benutzers.
Sie können Ihre Anwendung immer mit dem Leistungstool "Instruments Allocations" verknüpfen, um den Unterschied zu vergleichen.
Ein Objekt reserviert immer die gleiche Menge an Speicher, wenn es zugewiesen wird, unabhängig von der Interaktion mit ihm. Zugegeben, ein Teil dieses Speichers ist nichts anderes als ein Zeiger auf den Speicher, der später zugewiesen werden kann (lazy loaded). Ich bin nicht sicher, was Sie mit "wie das Objekt instanziiert wird" meinen? Die Interaktion mit den Berührungen des Benutzers hat nichts mit der Speichernutzung zu tun. Die Datentypen, die die Klassendefinition enthält, sind die einzigen Faktoren, die sich auf die Speichernutzung auswirken. – d11wtq
Ein UIViewController, der aus einer Nib initialisiert wird, hätte wahrscheinlich einen (geringfügig) anderen Footprint als der initialisierte Code ... nein? –
Jedes identische Objekt weist immer die gleiche Speichermenge zu. Beispiel: Ein Array mit null Objekten benötigt weniger Speicher als ein Array mit Elementen, aber zwei Arrays, die mit denselben Objekten oder ohne Objekte erstellt wurden, verwenden dieselbe Speichermenge. Alle Objekte, die an diese Klasse übergeben oder von ihr erstellt wurden, verwenden Speicher, bis sie freigegeben werden. Darüber hinaus verwenden alle an das Objekt/die Klasse gesendeten Benachrichtigungen Speicher. –
Versuchen Sie class_getInstanceSize([MyClass class]);
. Grob gesagt, ist die Speicherbelegung einer Instanz dieser Wert auf ein Vielfaches von sechzehn Bytes aufgerundet. Natürlich beinhaltet dies nicht den Overhead von assoziierten Objekten (siehe objc_setAssociatedObject
) oder Zuweisungen, die die Klasse macht. vorstellen
- 1. ObjectiveC - Anzeigefenster durch verteilte Objekte
- 2. einen großen dynamischen Speicher in Redux
- 3. Does ggvisOutput haben einen Klick Option ähnlich wie plotOutput
- 4. Kann ich einen ObjectiveC @selector in ein NSDictionary einfügen?
- 5. Schwierige Bildsegmentierung: Hintergrund und Objekte sind ähnlich
- 6. Wie verwendet Java-Objekte Speicher?
- 7. Nicht genügend Speicher bei einer großen Abfrage?
- 8. 2D Dynamische Speicherzuweisung - ObjectiveC
- 9. ObjectiveC-Blöcke Java-Äquivalent
- 10. AMF0 Parser in ObjectiveC
- 11. C++ löschen Vektor, Objekte, Freier Speicher
- 12. Wie in reinem css ähnlich den großen Websites zu entwerfen
- 13. Welche Beziehung haben die Objekte?
- 14. CompleableFuture, veränderbare Objekte und Speicher Sichtbarkeit
- 15. Einen großen Datensatz transponieren
- 16. ObjectiveC - Freigabe von Objekten als Parameter
- 17. ObjectiveC: Wo private Instanzeigenschaften deklarieren?
- 18. Entwurf für persistente Objekte mit entkoppeltem Speicher
- 19. Realm alle Objekte kopieren
- 20. Alle Swift-Objekte erweitern
- 21. Alle eingebauten JavaScript-Objekte
- 22. einen Speicher vs forceUpdate()
- 23. Scala Stream hält intermediäre Objekte im Speicher
- 24. Wenn ein Python-Iterator iterierbare Objekte zurückgibt, wie kann ich diese Objekte in einen großen Iterator ketten?
- 25. Ich suche einen kontextbasierten Speicher für alle Größen
- 26. ObjectiveC - wie NSUserNotification Kennung Eigenschaft
- 27. Präsentieren Sie kleine ModalViewController ObjectiveC
- 28. Speicher-Snapshot eines großen C/C++ - Projekts (Windows/Unix)
- 29. SQlite lösche alle Zeilen, die einen bestimmten String-Wert haben
- 30. Schlüsselbefehle müssen alle einen Titel, Schlüssel und Selektor haben
Danke für all die tollen Antworten! Super informativ !! –