2010-11-26 4 views
0

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

+0

Danke für all die tollen Antworten! Super informativ !! –

Antwort

2

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

2

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.

0

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.

0

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.

+1

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

+0

Ein UIViewController, der aus einer Nib initialisiert wird, hätte wahrscheinlich einen (geringfügig) anderen Footprint als der initialisierte Code ... nein? –

+0

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. –

2

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

Verwandte Themen