2010-11-02 7 views
7

Gdybym zawierać kilka automatycznych właściwości tak:Jak automatyczne @syntezowane ivars wpływają na * prawdziwy * sizeof (MyClass)?

@property (nonatomic, readonly) NSInteger   test1; 
@property (nonatomic, readonly) NSInteger   test2; 
@property (nonatomic, readonly) NSInteger   test3; 
@property (nonatomic, readonly) NSInteger   test4; 

Ale nie deklaruje żadnych Ivars dla nich, mogę @synthesize je w pliku .m jak ten:

@synthesize test1; 
@synthesize test2; 
@synthesize test3; 
@synthesize test4; 

i to działa bez problemu, kompilator automatycznie dodaje iVars - sizeof (MyClass) pokazuje, że moja klasa jest (jak można się spodziewać) 16 bajtów większa niż bez tych właściwości zadeklarowanych i zsyntetyzowanych. Jednakże, jeśli nie je syntetyzować i wdrożyć je tak:

- (NSInteger)test1 
{ 
    return 0; 
} 
- (NSInteger)test2 
{ 
    return 0; 
} 
- (NSInteger)test3 
{ 
    return 0; 
} 
- (NSInteger)test4 
{ 
    return 0; 
} 

następnie moja klasa powraca do swojego pierwotnego rozmiaru. Jest to określane na podstawie sizeof WITHIN pliku .m dla MyClass - tak więc kompilator wie na tym etapie, czy zmienne zostały zsyntetyzowane lub zaimplementowane.

Jednak inne klasy nie wiedzą tego po prostu z pliku nagłówkowego, sizeof (MyClass) pokazuje rozmiar BEZ dodatkowych (automatycznych) iVars, niezależnie od tego, czy są syntezowane czy nie. Wydaje mi się to całkowicie pomieszane, że sizeof może zwrócić inną wartość. W jaki sposób kompilator zachowuje się poprawnie podczas podklasy i podczas korzystania z operatora dereference + offset (->) w publicznych iVar podklasy, jeśli nie może być pewien rozmiaru klasy?

Odpowiedz

4

Przeczytaj tę doskonałą słupek non-fragile ivars przez zawsze pomocny chomika. Przeczytaj także this post z miłością.

użycie operatora sizeof jest całkiem bezużyteczny do obiektu Obj-C. Środowisko wykonawcze nie używać go do manipulowania rzeczy, wierzę.

+0

Zadałem następujące pytanie: http://stackoverflow.com/questions/4089316/do-dynamic-ivars-break-the-strict-superset-of-c-paradigm-for-objective-c – jhabbott

2

Obj-C działają wskaźniki. Wiele rzeczy jest wykonywanych w środowisku wykonawczym, a nie w czasie kompilacji, a właściwie nie można używać klasy Obj-C jako wartości, a jedynie wskaźniki. Na przykład można uzyskać dowolną wartość za pomocą valueForKey: i wywołać dowolną metodę za pomocą performSelector :. W rzeczywistości można nawet zmienić implementację metod w czasie wykonywania metodami z (jak class_replaceMethod).

Dolna linia: Obj-C jest daleki od tego, co widzieliście w C i C++. Wiele rzeczy, jeśli wykonywane w czasie wykonywania, co daje pewną elastyczność, a także trochę bólu. Jest po prostu inaczej. Należy przeczytać docs firmy Apple o obj-C a może książka o języku (na przykład, programowania w Objective-C”Stephen G. Kochan)

+0

Właściwości i przełączniki mają mieszań wewnętrzne tak, że mogą one być sprawdzane po nazwie w czasie wykonywania, myślę, że ivars mogą być przeglądane w czasie łącza, umożliwiając dynamiczne wiązanie bez znajomości przesunięcia ivars z góry (nie jestem pewien to jednak). Jednak sizeof powinien znać rozmiar klasy podczas kompilacji i ma być spójny, jednak w moim przykładzie sizeof zwraca różne wartości dla tej samej klasy, w zależności od tego, czy jest używana w samej klasie, czy na zewnątrz. – jhabbott

Powiązane problemy