Suche…


Syntax

  • typedef struct { typeA EigenschaftA ; typeB-EigenschaftB ; ...} StructName

Bemerkungen

In Objective C sollten Sie fast immer ein Objekt anstelle einer Struktur verwenden. Es gibt jedoch immer noch Fälle, in denen die Verwendung einer Struktur besser ist, z.

  • Wenn Sie viele Werte des Typs (struct) erstellen und zerstören möchten, benötigen Sie eine gute Leistung und einen geringen Speicherbedarf
  • Strukturen sind schneller zu erstellen und zu verwenden, da beim Aufruf einer Methode für ein Objekt die Methode zur Laufzeit bestimmt werden muss
  • Strukturen nehmen weniger Größe in Anspruch, da Objekte die zusätzliche Eigenschaft isa , die ihre Klasse enthält
  • Wenn der Wert nur ein paar Eigenschaften und eine geringe Gesamtgröße hat ( CGSize nehmen; es hat 2 Floats, die jeweils 4 Bytes sind, kann also 8 Bytes CGSize ) und wird häufig verwendet (hängt mit dem erster Punkt)
  • Wenn Sie Unions oder Bitfields verwenden könnten und vor allem die von ihnen gespeicherte Größe benötigen, weil Sie nur wenig Speicherplatz benötigen (in Verbindung mit dem ersten Punkt)
  • Wenn Sie wirklich ein Array innerhalb der Struktur speichern möchten, da Objective-C-Objekte C-Arrays nicht direkt speichern können. Beachten Sie jedoch, dass Sie immer noch "indirekt" ein Array in einem Objective-C-Objekt abrufen können, indem Sie es als Referenz verwenden (dh geben Sie type * anstelle des C-Array- type[] ) ein.
  • Wenn Sie mit einem anderen Code, z. B. einer Bibliothek, kommunizieren müssen, ist dies in C codiert. Strukturen sind vollständig in C implementiert, Objekte jedoch nicht

CGPoint

Ein wirklich gutes Beispiel für eine struct ist CGPoint . Es ist ein einfacher Wert, der einen 2-dimensionalen Punkt darstellt. Es hat 2 Eigenschaften, x und y , und kann als geschrieben werden

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

Wenn Sie zuvor Objective-C für Mac oder iOS-App-Entwicklung verwendet haben, stoßen Sie mit CGPoint Wahrscheinlichkeit auf CGPoint . CGPoint halten so ziemlich alles auf dem Bildschirm, von Ansichten und Steuerelementen über Objekte in einem Spiel bis zu Änderungen in einem Farbverlauf. Dies bedeutet, dass CGPoint verwendet werden. Dies gilt umso mehr bei wirklich leistungsstarken Spielen. Diese Spiele neigen dazu, viele Objekte zu haben, und alle diese Objekte benötigen Positionen. Diese Positionen sind oft entweder CGPoint Positionen oder eine andere Art von Struktur, die einen Punkt übermittelt (z. B. einen 3-dimensionalen Punkt für 3D-Spiele).


Punkte wie CGPoint können leicht als Objekte dargestellt werden

@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

Wenn CGPoint auf diese Weise verwendet wird, CGPoint es jedoch viel länger, Punkte zu erstellen und zu CGPoint . In kleineren, schnelleren Programmen würde dies keinen Unterschied verursachen, und in diesen Fällen wäre es in Ordnung oder vielleicht sogar besser, Objektpunkte zu verwenden. In großen Programmen, in denen häufig Punkte verwendet werden, kann das Verwenden von Objekten als Punkte die Leistung stark beeinträchtigen, das Programm verlangsamen und Speicherplatz verschwenden.

Struktur definieren und Strukturmitglieder aufrufen

Das Format der struct-Anweisung lautet wie folgt:

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

Beispiel: deklarieren Sie die ThreeFloats-Struktur:

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

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

Beim Senden einer Instanz von MyClass wird die Nachricht valueForKey: mit dem Parameter @ "threeFloats" die MyClass-Methode threeFloats aufgerufen und das Ergebnis in einem NSValue zurückgegeben.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow