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 del type[] C-array type[] )
  • 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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow