Objective-C Language
structs
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 hettype[]
C-arraytype[]
) - 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.