2009-09-03 11 views
9

Powiedzmy Mam klasy zadeklarowane jako:W Objective-C, w jaki sposób + przydzielić wiedzieć, ile pamięci do przydzielenia?

@class SomeClass 

@interface SomeClass: NSObject { 
    NSString *myString; 
    NSString *yourString; 
} 

@end 

A później, w jakiś inny kod mówię:

SomeClass *myClass = [[SomeClass alloc] init]; 

Jak SomeClass wiedzieć, ile pamięci przeznaczyć zważywszy, że nie nadpisać + przydzielić? Prawdopodobnie wymaga przechowywania dla ivars myString i yourString, ale używa + przydziału dziedziczonego z NSObject. Czy istnieje materiał referencyjny, który obejmuje te szczegóły?

Odpowiedz

14

+alloc to tylko metoda klasowa, jak każda inna. Domyślna implementacja w NSObject, używa class_getInstanceSize(), aby uzyskać rozmiar instancji, który powinien zostać przydzielony. Wielkość instancji jest określana na podstawie kombinacji składu czasu kompilacji dla danej klasy (bez dziedziczenia) i obliczania czasu działania dla całkowitej wielkości klasy i wszystkich klas nadrzędnych. W ten sposób możliwe jest niewrażliwe iVars w 64 bitowych i środowisko wykonawcze iPhone'a.

Niektóre klasy, w szczególności klastry klas, nie wykonują prawdziwej alokacji instancji, dopóki nie zostanie wywołany inicjator (dlatego ważne jest, aby w metodach inicjalizujących wykonać self = [super init]).

+1

Czym są klastry klas? Czy to jest termin Celu C, z którym powinienem być bardziej zaznajomiony? –

+1

NSString to na przykład klaster klasy. Kiedy tworzysz NSString, dostajesz instancję jakiejkolwiek podklasy jest zoptymalizowana do obsługi tego konkretnego typu łańcucha. – bbum

4

+[NSObject alloc] postanawia wywołać środowisko wykonawcze Objective-C, które zna rozmiar każdej klasy.

-2

Metoda alloc jest odpowiednikiem sizeof, gdy przechodzi do tworzenia nowego obiektu. Ponadto zmienne instancji myString i yourString nie mają zbyt dużej pamięci: są po prostu wskaźnikami, więc wystarczy przydzielić wystarczającą ilość pamięci do przechowywania adresów.

+2

To nie robi; sizeof jest operacją tylko w czasie kompilacji. Rozmiar alokacji jest określany w czasie wykonywania. – bbum

+0

Tak, myString i yourString nie mają zbyt dużo miejsca, ale mają pewne i są znaczące i muszą być gdzieś przydzielone. –

+0

myString i yourString są dokładnie wielkością wskaźnika w SomeClass. – bbum

Powiązane problemy