Objective-C Language
Structs
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 BytesCGSize
) 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.