Objective-C Language
Struktury
Szukaj…
Składnia
- typedef struct { typeA propertyA ; typeB właściwość B ; ...} StructName
Uwagi
W celu C prawie zawsze powinieneś używać obiektu zamiast struktury. Jednak nadal istnieją przypadki, w których użycie struktury jest lepsze, na przykład:
- Kiedy zamierzasz tworzyć i niszczyć wiele wartości typu (struct), więc potrzebujesz dobrej wydajności i małego zużycia pamięci
- Tworzenie i używanie struktur jest szybsze, ponieważ podczas wywoływania metody na obiekcie metodę należy określić w czasie wykonywania
- Struktury zajmują mniejszy rozmiar, ponieważ obiekty mają dodatkową właściwość
isa
, która utrzymuje ich klasę
- Gdy wartość ma tylko kilka właściwości i mały całkowity rozmiar (weź
CGSize
; ma 2CGSize
, z których każdy ma 4 bajty, więc może zająć 8 bajtów) i będzie często używane (wiąże się z pierwszy punkt) - Kiedy możesz używać związków lub pól bitowych i, co ważne, potrzebujesz rozmiaru zapisanego przez nich, ponieważ potrzebujesz małego zużycia pamięci (wiąże się z pierwszym punktem)
- Gdy naprawdę chcesz przechowywać tablicę wewnątrz struktury, ponieważ obiekty Objective-C nie mogą bezpośrednio przechowywać tablic C. Zauważ jednak, że nadal możesz „pośrednio” uzyskać tablicę w obiekcie Objective-C, czyniąc ją referencją (tzn.
type *
zamiast typu C-arraytype[]
) - Kiedy potrzebujesz komunikować się z jakimś innym kodem, takim jak biblioteka, który jest zakodowany w C; Struktury są w pełni zaimplementowane w C, ale obiekty nie
CGPoint
Jednym naprawdę dobrym przykładem struktury jest CGPoint
; jest to prosta wartość reprezentująca punkt dwuwymiarowy. Ma 2 właściwości, x
i y
, i można go zapisać jako
typedef struct {
CGFloat x;
CGFloat y;
} CGPoint;
Jeśli wcześniej korzystałeś z Objective-C na Maca lub iOS, prawie na pewno trafiłeś na CGPoint
; CGPoint
utrzymują pozycję prawie wszystkiego na ekranie, od widoków i elementów sterujących, przez obiekty w grze, po zmiany gradientu. Oznacza to, że CGPoint
są często używane. Jest to tym bardziej prawdziwe w przypadku gier wymagających dużej wydajności; gry te mają zwykle wiele obiektów i wszystkie te obiekty wymagają pozycji. CGPoint
tymi są często CGPoint
lub inny rodzaj struktury, która przenosi punkt (na przykład trójwymiarowy punkt dla gier 3D).
Punkty takie jak CGPoint
można łatwo przedstawić jako obiekty, takie jak
@interface CGPoint {
CGFloat x;
CGFloat y;
}
... //Point-related methods (e.g. add, isEqualToPoint, etc.)
@property(nonatomic, assign)CGFloat x;
@property(nonatomic, assign)CGFloat y;
@end
@implementation CGPoint
@synthesize x, y;
...
@end
Jednak jeśli CGPoint
używany w ten sposób, tworzenie punktów i manipulowanie nimi trwałoby znacznie dłużej. W mniejszych, szybszych programach tak naprawdę nie spowodowałoby to różnicy, a w takich przypadkach byłoby dobrze, a może nawet lepiej użyć punktów obiektowych. Ale w dużych programach, w których punkty są często używane, używanie obiektów jako punktów może naprawdę zaszkodzić wydajności, spowalniając program, a także marnować pamięć, co może zmusić program do awarii.
Definiowanie struktury i uzyskiwanie dostępu do elementów struktury
Format instrukcji struct jest następujący:
struct [structure tag]
{
member definition;
member definition;
...
member definition;
} [one or more structure variables];
Przykład: zadeklaruj strukturę ThreeFloats:
typedef struct {
float x, y, z;
} ThreeFloats;
@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end
Wysłanie instancji MyClass komunikat o wartości valueForKey: z parametrem @ „threeFloats” wywoła metodę MyClass threeFloats i zwróci wynik zawinięty w wartość NSValue.