Zoeken…


Syntaxis

  • typedef struct { typeA eigenschapA ; typeB eigenschapB ; ...} StructName

Opmerkingen

In doelstelling C moet u bijna altijd een object gebruiken in plaats van een struct. Er zijn echter nog steeds gevallen waarin het gebruik van een struct beter is, zoals:

  • Wanneer je veel waarden van het (struct) type gaat maken en vernietigen, heb je dus goede prestaties en een klein geheugengebruik nodig
  • Structs zijn sneller te maken en te gebruiken omdat bij het aanroepen van een methode op een object, de methode moet worden bepaald tijdens runtime
  • Structuren nemen minder grootte in beslag omdat objecten een extra eigenschap isa , die hun klasse bezit
  • Wanneer de waarde slechts een paar eigenschappen en een kleine totale grootte heeft (neem CGSize ; het heeft 2 drijvers met elk 4 bytes, dus het kan 8 bytes in beslag nemen), en wordt veel gebruikt (hangt samen met de eerste punt)
  • Wanneer u vakbonden of bitvelden kunt gebruiken , en belangrijker, moet u de grootte opslaan die door hen is opgeslagen, omdat u weinig geheugengebruik nodig heeft (sluit aan bij het eerste punt)
  • Wanneer u echt een array in de struct wilt opslaan, omdat Objective-C-objecten niet direct C-arrays kunnen opslaan. Houd er echter rekening mee dat u nog steeds "indirect" een array in een Objective-C-object kunt krijgen door er een referentie van te maken (dat wil zeggen type * in plaats van het type[] C-array type[] )
  • Wanneer u moet communiceren met een andere code, zoals een bibliotheek, is dat gecodeerd in C; structs worden volledig geïmplementeerd in C, maar objecten niet

CGPoint

Een heel goed voorbeeld van een struct is CGPoint ; het is een eenvoudige waarde die een tweedimensionaal punt vertegenwoordigt. Het heeft 2 eigenschappen, x en y , en kan worden geschreven als

typedef struct {
    CGFloat x;
    CGFloat y;
} CGPoint;

Als u Objective-C voor Mac- of iOS-app-ontwikkeling eerder hebt gebruikt, bent u vrijwel zeker CGPoint ; CGPoint 's houden de positie vast van vrijwel alles op het scherm, van weergaven en bedieningselementen tot objecten in een game tot veranderingen in een verloop. Dit betekent dat CGPoint 's veel worden gebruikt. Dit geldt nog meer voor games die echt prestaties vereisen; deze spellen hebben meestal veel objecten en al deze objecten hebben posities nodig. Deze posities zijn vaak CGPoint 's of een ander type struct dat een punt overbrengt (zoals een driedimensionaal punt voor 3D-games).


Punten zoals CGPoint kunnen gemakkelijk worden weergegeven als objecten, zoals

@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

Als CGPoint op deze manier zou worden gebruikt, zou het veel langer duren om punten te maken en te manipuleren. In kleinere, snellere programma's zou dit niet echt een verschil veroorzaken, en in die gevallen zou het OK zijn of misschien zelfs beter om objectpunten te gebruiken. Maar in grote programma's waar punten veel worden gebruikt, kan het gebruik van objecten als punten de prestaties echt schaden, het programma langzamer maken en ook geheugen verspillen, waardoor het programma kan crashen.

Een structuur definiëren en toegang krijgen tot structuurleden

De indeling van de struct-instructie is deze:

struct [structure tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables]; 

Voorbeeld: declareer de ThreeFloats-structuur:

   typedef struct {
    float x, y, z;
} ThreeFloats;

@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end

Als een exemplaar van MyClass wordt verzonden, wordt het bericht valueForKey: met de parameter @ "threeFloats" opgeroepen de MyClass-methode threeFloats en wordt het resultaat verpakt in een NSValue geretourneerd.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow