Sök…


Syntax

  • typedef struct { typeA propertyA ; typB-egenskapB ; ...} StructName

Anmärkningar

I mål C bör du nästan alltid använda ett objekt istället för en struktur. Det finns dock fortfarande fall där användningen av en struktur är bättre, till exempel:

  • När du ska skapa och förstöra många värden av typen (struktur), så du behöver bra prestanda och liten minnesanvändning
  • Strukturer är snabbare att skapa och använda eftersom metoden måste bestämmas vid körning när man ringer en metod på ett objekt
  • Structs tar upp mindre storlek eftersom föremålen har en extra egenskap isa , som håller sin klass
  • När värdet bara har ett par egenskaper och en liten CGSize (ta CGSize ; det har 2 flottörer som är 4 byte vardera, så det kan ta upp 8 byte), och kommer att användas mycket (kopplas in med första punkten)
  • När du kan använda fackföreningar eller bitfält , och viktigast av allt, behöver du den storlek som sparats av dem eftersom du behöver lite minnesanvändning (ansluter till den första punkten)
  • När du verkligen vill lagra en matris inuti strukturen, eftersom Objekt-C-objekt inte direkt kan lagra C-arrayer. Observera dock att du fortfarande "indirekt" kan få en matris i ett Objekt-C-objekt genom att göra det till en referens (dvs. type * i stället för type[] C-array type[] )
  • När du behöver kommunicera med någon annan kod, till exempel ett bibliotek, är det kodat i C; strukturer implementeras fullt ut i C men objekt är det inte

CGPoint

Ett riktigt bra exempel på en struktur är CGPoint ; det är ett enkelt värde som representerar en tvådimensionell punkt. Den har 2 egenskaper, x och y , och kan skrivas som

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

Om du tidigare använde Objekt-C för Mac- eller iOS-apputveckling har du nästan säkert stött på CGPoint ; CGPoint s innehar positionen för nästan allt på skärmen, från vyer och kontroller till objekt i ett spel till förändringar i en lutning. Detta innebär att CGPoint er används mycket. Detta är ännu sant med riktigt prestandatunga spel; dessa spel tenderar att ha många objekt och alla dessa objekt behöver positioner. Dessa positioner är ofta antingen CGPoint , eller någon annan typ av struktur som förmedlar en punkt (till exempel en 3-dimensionell punkt för 3d-spel).


Punkter som CGPoint kan lätt representeras som objekt

@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

Men om CGPoint användes på detta sätt skulle det ta mycket längre tid att skapa och manipulera punkter. I mindre, snabbare program skulle detta egentligen inte orsaka skillnad, och i dessa fall skulle det vara OK eller kanske ännu bättre att använda objektpunkter. Men i stora program där poäng används mycket kan användning av objekt som punkter verkligen skada prestanda, göra programmet långsammare och också slösa minne, vilket kan tvinga programmet att krascha.

Definiera en struktur och få åtkomst till strukturmedlemmar

Formatet för struktuttalandet är detta:

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

Exempel: förklara strukturen ThreeFloats:

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

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

Skicka en instans av MyClass meddelandet valueForKey: med parametern @ "threeFloats" påkallar MyClass-metoden threeFloats och returnerar resultatet inslaget i en NSValue.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow