Objective-C Language
Structs
Recherche…
Syntaxe
- typedef struct { typeA propertyA ; typeB propertyB ; ...} StructName
Remarques
Dans Objective C, vous devriez presque toujours utiliser un objet au lieu d'une structure. Cependant, il existe encore des cas où l’utilisation d’une structure est meilleure, comme par exemple:
- Lorsque vous allez créer et détruire de nombreuses valeurs du type (struct), vous avez donc besoin de bonnes performances et d'une faible utilisation de la mémoire
- Les structures sont plus rapides à créer et à utiliser car lors de l'appel d'une méthode sur un objet, la méthode doit être déterminée à l'exécution.
- Les structures prennent moins de taille car les objets ont une propriété supplémentaire
isa
, qui contient leur classe
- Lorsque la valeur n'a que quelques propriétés et une petite taille totale (prenez
CGSize
; elle a 2 flottants de 4 octets chacun, elle peut donc prendre 8 octets), et va être utilisée beaucoup premier point) - Lorsque vous pouvez utiliser des unions ou des champs de bits et, plus important encore, vous avez besoin de la taille enregistrée car vous avez besoin d'une petite quantité de mémoire (liée au premier point)
- Lorsque vous voulez vraiment stocker un tableau à l'intérieur de la structure, puisque les objets Objective-C ne peuvent pas stocker directement les tableaux C. Cependant, notez que vous pouvez toujours "indirectement" obtenir un tableau dans un objet Objective-C en en faisant une référence (par exemple,
type *
à la place dutype[]
C-arraytype[]
) - Lorsque vous devez communiquer avec un autre code, tel qu'une bibliothèque, cela est codé en C; Les structures sont complètement implémentées en C mais les objets ne sont pas
CGPoint
Un bon exemple de struct est CGPoint
; c'est une valeur simple qui représente un point à deux dimensions. Il a 2 propriétés, x
et y
, et peut être écrit comme
typedef struct {
CGFloat x;
CGFloat y;
} CGPoint;
Si vous avez déjà utilisé le développement d'applications Objective-C pour Mac ou iOS, vous avez certainement rencontré CGPoint
. CGPoint
maintient la position de presque tout à l'écran, des vues et des contrôles aux objets d'un jeu, en passant par les changements de dégradé. Cela signifie que les CGPoint
sont beaucoup utilisés. Cela est encore plus vrai avec des jeux très performants. Ces jeux ont tendance à avoir beaucoup d'objets et tous ces objets ont besoin de positions. Ces positions sont souvent soit CGPoint
s, soit un autre type de structure qui transmet un point (comme un point tridimensionnel pour les jeux 3D).
Des points comme CGPoint
peuvent facilement être représentés comme des objets, comme
@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
Cependant, si CGPoint
était utilisé de cette manière, la création et la manipulation de points prendraient beaucoup plus de temps. Dans les programmes plus petits et plus rapides, cela ne causerait pas vraiment de différence, et dans ce cas, il serait correct ou même préférable d'utiliser des points d'objet. Mais dans les grands programmes où les points sont souvent utilisés, l'utilisation d'objets en tant que points peut vraiment nuire aux performances, ce qui ralentit le programme et gaspille également de la mémoire, ce qui pourrait forcer le programme à planter.
Définition d'une structure et accès aux membres de la structure
Le format de l'instruction struct est le suivant:
struct [structure tag]
{
member definition;
member definition;
...
member definition;
} [one or more structure variables];
Exemple: déclarez la structure ThreeFloats:
typedef struct {
float x, y, z;
} ThreeFloats;
@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end
Envoyer une instance de MyClass au message valueForKey: avec le paramètre @ "threeFloats" invoquera la méthode MyClass threeFloats et renverra le résultat encapsulé dans une NSValue.