2009-11-13 5 views
2

Je suis assez nouveau dans le monde d'Objective-C et j'ai une longue histoire avec .net/C# donc naturellement je suis enclin à utiliser mon esprit C#.NSArray, les types primitifs et la boxe Oh My!

Maintenant, voici la question: je me sens vraiment enclin à créer un certain type de simple, collection Objective-C pour tenir les types primitifs parce que je n'aime pas le concept d'emballage d'un type primitif dans un objet (à savoir NSNumber) et puis en ajoutant cela à une collection telle que NSArray. Le fait est que je comprends parfaitement que NSArray ne fonctionne que sur des objets. Cependant, cela me semble vraiment stupide que nous soyons obligés de travailler avec des primitives en boîte simplement parce qu'il n'existe aucune collection pour travailler sur des entiers primitifs par exemple. Donc les gars de C# sauront de quoi je parle dans les vieux jours avec .net. Généralement, vous utiliseriez un simple tableau ou une ArrayList lorsque les génériques n'étaient pas encore disponibles. Le ArrayList vous oblige essentiellement à encadrer vos types primitifs, mais il l'a fait dans les coulisses et vous avez payé un cher coût pour cela (en termes de performance.)

Si vous ne pouviez pas faire face au coût de la performance, alors vous avez roulé votre propre collection personnalisée ou éventuellement utilisé des génériques quand ils sont sortis. Maintenant, dans le monde de l'Objective-C, il semble que nous soyons obligés de nous attaquer de nouveau à ce problème, mais c'est comme si les développeurs d'Apple ne s'en soucient pas vraiment, ou ce n'est pas grave. Donc, ma question est: Quelle est la pratique recommandée ici? Dois-je essayer de créer mes propres collections Objective-C personnalisées pour tenir un NSInteger par exemple? Ou devrais-je juste utiliser un tableau C natif comme codeur collègue Memo suggère dans cet article de blog: NSArray vs. C Array performance

Ou dois-je rester avec les collections intégrées d'Apple et mordre la balle. Il semble que les caractéristiques de performance expliquées par Memo méritent d'être prises en compte lors de la création d'applications critiques.

Ce message était une bouchée mais j'ai dû le sortir de ma poitrine.

+0

Est-ce simplement quelque chose qui vous dérange sur le langage/les frameworks ou avez-vous des cas spécifiques où les performances sont affectées? – sbooth

Répondre

2

Personnellement, je suggère d'utiliser l'objectif C++ et std :: vector <>; à moins que vous ayez réellement besoin d'utiliser un conteneur natif de l'objectif C, ce qui vous oblige à utiliser des objets.

0

Si vous ne voulez conserver que NSIntegers, pouvez-vous simplement utiliser un tableau C normal? Edit: Si vous faites cela pour des raisons de performances, cela me semble être une très bonne optimisation prématurée.

+0

Si vous construisez une application simple, juste comme un NavigationController et certains UIViews ... alors oui, c'est probablement une optimisation prématurée mais si vous faites quelque chose de graphique où vous vous souciez réellement de ces micro-optimisations que cela compte. Quand il s'agit de quelque chose comme ça, vous le prenez où vous pouvez l'obtenir. –

+0

Bon point. Je ne devrais probablement pas répondre au genou quand mon cerveau est plein d'autres choses. ;) – Wevah

0

Je n'ai jamais vraiment eu besoin d'un tableau dynamique d'entiers car il y a toujours eu une meilleure solution au problème que j'essaie de résoudre. Par exemple, NSData peut stocker un tableau d'octets, ou vous pouvez utiliser NSIndexSet si c'est un ensemble d'entiers que vous voulez.

Vous pouvez également utiliser CFArrayCreate et passer dans les fonctions de rappel appropriées (et l'envelopper dans Objective-C si vous le souhaitez).

Avez-vous un problème spécifique que vous essayez de résoudre?

0

Le chemin de la matrice C via malloc nécessite de prendre en compte le cycle de vie du propriétaire de la baie afin de le libérer. D'autres considérations, par ex. ARC et le redimensionnement de la matrice, etc. rendent l'approche «d'emballage» attrayante. Les seules raisons que je vois pour 'style C' sont si le projet est un port ou basé sur les résultats du profileur.Si vous décidez d'envelopper, prenez en compte une approche telle que NSArray+Primitive qui crée une catégorie pour ajouter une fonctionnalité de type primitif à NSArray et NSMutableArray.

Questions connexes