Utilisation de Structs dans Objective-C (pour iOS): optimisation prématurée?
Je me rends compte que ce qui compte, comme l'optimisation prématurée est une composante subjective, mais c'est une empiriques ou les meilleures pratiques de la question.
Lors de la programmation pour iOS, dois-je préfère utiliser struct
et typedefs où l'objet n'a pas de "problème" (méthodes, essentiellement)? Mon sentiment est que les struct
la syntaxe est un peu étrange pour un non-C personne, mais qu'il devrait être de MANIÈRE à profil plus bas. Là encore, les tests de certains cas avec 50K NSObject
cas, il ne semble pas mauvais (parent, je sais). Dois-je "habituer" (utiliser les structures où c'est possible) ou sont NSObject
cas d'accord, à moins que j'ai des problèmes de performances?
Le cas typique serait une classe avec deux int
variables membres. J'ai lu que l'utilisation d'une structure de tenir deux NSString
instances (ou tout NSObject
sous-classe) est une mauvaise idée.
source d'informationauteur Dan Rosenstark
Vous devez vous connecter pour publier un commentaire.
Aller avec des objets jusqu'à ce que vous frappez un mesurables goulot d'étranglement des performances. J'ai utilisé du code de haut niveau, même dans le jeu serré des boucles sans les problèmes de messagerie, les classes de collection, autorelease piscines, pas de problèmes.
Struct
s avecNSObject
instances sont certainement une mauvaise idée. Vous avez besoin-init
et-dealloc
pour gérer les conserver compter correctement. Écritretain
etreleases
de l'appelant côté est juste fou. Il ne sera jamais rembourser.Struct
s avec deuxint
ou quatredouble
s sont des cas limites. Le Cacao cadre lui-même met en œuvreNSRect
NSPoint
etc. comme une struct. Mais que fait l'a confondu des tas et des tas de nouveaux arrivants. Honnêtement, même la distinction entre les types primitifs et les types d'objets confus. Il est encore confus pour moi quand vous avezstruct
s comme des propriétés d'un objet: vous ne pouvez pas faireSi vous commencez à faire votre propre
struct
s, vous devez vous rappeler qui est qui. C'est de nouveau un problème. Je pense que la raison pour laquelle ils (NSRect
etc.) sontstruct
s sont essentiellement historiques.Je préfère faire tout les objets. Et l'utilisation de collecte des ordures si disponible.
Et, ne pas demander aux gens si quelque chose vaut la peine de l'optimisation ou pas. Mesurer vous-même par des Instruments ou quoi que ce soit. En fonction de l'environnement (ppc vs intel, OS X vs iOS, iPad vs iPhone) d'une manière qui a été plus rapide dans un précédent système peut être plus lente dans un nouveau système.
Un Objectif objet C a presque la même, le stockage d'un struct, sauf qu'il est de 4 octets (8 octets, 64 bits) plus grand. Voilà, juste un pointeur dans un endroit où le runtime contient toutes les informations de classe.
Si vous êtes serré sur la mémoire, puis perdre les 4 octets, mais généralement c'est seulement pour un grand nombre d'objets: de 50 000 Nsobjects vs structs est seulement 200k - vous obtenez beaucoup de choses pour que 200k. Pour un million d'objets, le coût de l'ajouter sur un iPhone.
Si vous voulez dire de transférer les éléments d'openGL ou besoin d'un c tableau pour d'autres fins, puis une autre option est de faire UN NSObject qui a un malloc ed pointeur à tous les 50 000 entiers. L'objectif de c charge de la mémoire est ~0, et vous pouvez encapsuler toutes les sales malloc et free() des choses dans les entrailles de l'un .m de fichier.
Je ne vois pas de problème du tout avec l'aide des structures pour la tenue de petites quantités de primitive (non objet) types où il n'y a pas de comportement requis. Il existe déjà plusieurs exemples de ce type dans le Cacao cadres (CGRect, CGSize, CGPointNSRange par exemple).
Ne pas utiliser les structures de tenir Objective-C objets. Cela complique la gestion de la mémoire dans le décompte de références de l'environnement et peut se briser tout à fait dans la GC environnement.
Pour moi, je préfère utiliser des objets parce que vous pouvez facilement faire de l'Objet de travail avec elle comme la conserver, la libération, l'autorelease. Je ne vois que très peu de structures dans le Cadre de Cacao comme CGSize, CGRect et CGPoint. Je pense que la raison en est qu'ils sont beaucoup utilisés
Je crois est une bonne idée d'utiliser des structures spécialement si vous travaillez avec des C-base de cadres de , permet de dit OpenGL, CoreGraphics, CoreText spécialement trucs qui nécessiteront un couple/triple de l'ints, des chambres doubles, chars, etc. (Si elles sont déjà mises en œuvre dans certains de Pomme de Cadres: CGRect, CGPoint, CTRect, NSRange, etc...) C trucs joue et regarde mieux avec les autres C des trucs.
Je ne pense pas que je voudrais écrire une sous-classe de NSObject contenant un couple d'entiers. C'est presque ridicule. lol.