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 2 CGSize , 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-array type[] )
  • 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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow