Objective-C Language
Structs
Ricerca…
Sintassi
- typedef struct { typeA propertyA ; proprietà di tipo B ; ...} StructName
Osservazioni
In Objective C, dovresti quasi sempre usare un oggetto invece di una struct. Tuttavia, ci sono ancora casi in cui l'utilizzo di una struct è migliore, come ad esempio:
- Quando stai creando e distruggendo molti valori del tipo (struct), quindi hai bisogno di buone prestazioni e di un uso limitato della memoria
- Le strutture sono più veloci da creare e utilizzare perché quando si chiama un metodo su un oggetto, il metodo deve essere determinato in fase di runtime
- Le strutture occupano meno dimensioni perché gli oggetti hanno
isa
proprietà aggiuntive, che mantiene la loro classe
- Quando il valore ha solo un paio di proprietà e una piccola dimensione totale (prendi
CGSize
, ha 2 float che sono 4 byte ciascuno, quindi può richiedere fino a 8 byte), e sarà usato molto (si collega con il primo punto) - Quando potresti usare sindacati o bitfield e, soprattutto, hai bisogno della dimensione salvata da loro perché hai bisogno di un piccolo utilizzo della memoria (legami con il primo punto)
- Quando si desidera realmente archiviare una matrice all'interno della struttura, poiché gli oggetti Objective-C non possono memorizzare direttamente gli array C. Tuttavia, si noti che è ancora possibile "indirettamente" ottenere un array in un oggetto Objective-C rendendolo un riferimento (ad esempio,
type *
al posto deltype[]
C-arraytype[]
) - Quando hai bisogno di comunicare con un altro codice, come una libreria, questo è codificato in C; le strutture sono completamente implementate in C ma gli oggetti no
CGPoint
Un ottimo esempio di struttura è CGPoint
; è un valore semplice che rappresenta un punto bidimensionale. Ha 2 proprietà, x
ed y
, e può essere scritto come
typedef struct {
CGFloat x;
CGFloat y;
} CGPoint;
Se hai già utilizzato Objective-C per lo sviluppo di app per Mac o iOS, quasi certamente ci si imbatte in CGPoint
; CGPoint
mantengono la posizione di praticamente tutto sullo schermo, dalle viste e i controlli agli oggetti di un gioco, ai cambiamenti in una sfumatura. Ciò significa che i CGPoint
vengono utilizzati molto. Questo è ancora più vero con giochi davvero performanti; questi giochi tendono ad avere molti oggetti e tutti questi oggetti hanno bisogno di posizioni. Queste posizioni sono spesso o CGPoint
, o qualche altro tipo di struttura che trasmette un punto (come un punto tridimensionale per i giochi 3D).
Punti come CGPoint
potrebbero essere facilmente rappresentati come oggetti, come
@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
Tuttavia, se CGPoint
fosse usato in questo modo, sarebbe necessario molto più tempo per creare e manipolare i punti. Nei programmi più piccoli e veloci questo non causerebbe realmente alcuna differenza, e in quei casi sarebbe OK o forse ancora meglio usare i punti oggetto. Ma nei grandi programmi in cui i punti sono usati molto, usare gli oggetti come punti può davvero danneggiare le prestazioni, rallentare il programma e sprecare memoria, il che potrebbe costringere il programma a bloccarsi.
Definizione di una struttura e accesso ai membri della struttura
Il formato della dichiarazione struct è questo:
struct [structure tag]
{
member definition;
member definition;
...
member definition;
} [one or more structure variables];
Esempio: dichiarare la struttura ThreeFloats:
typedef struct {
float x, y, z;
} ThreeFloats;
@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end
Inviando un'istanza di MyClass il valore valueForKey: con il parametro @ "threeFloats" si invocherà il metodo MyClass threeFloats e si restituirà il risultato racchiuso in un NSValue.