10
votes

Nsnumber vs int

Si les entiers ne peuvent pas être écrits dans un dictionnaire, puis à un .plist, mais Nsnumbers peut être préférable d'utiliser des nsnumbers dans l'application, plutôt que de ne pas convertir à chaque fois d'économiser ou de charger un dictionnaire d'un .plist? < / p>


3 commentaires

Notez que l'attribution de la mémoire est chère. Vous voudrez peut-être faire votre propre classe similaire à Nsnumber qui serait mutable.


Préfère nsinteger sur int . Ceci est plus portable parmi diverses versions de OS X.


Vous pouvez simplement substituer simplement un nsnumber (un objet) pour un int (une "valeur scalaire"). Il serait incroyablement maladroit de conserver toutes les quantités numériques dans un nsnumber et de convertir de / à pour chaque calcul. Utilisation de Nsinteger au lieu de int , d'autre part, est une chose raisonnable à faire.


3 Réponses :


0
votes

nsnumber est hérité de l'objet Wrapper NSValue.

int n'est pas objet.

Si vous utilisez Nsnumber U, vous pouvez obtenir de plus en plus de fonction à utiliser avec eux.

http: // Développeur..Com / Bibliothèque / Mac / # Documentation / Cocao / Référence / Fondation / CLASSES / NUMBER_CLASS / Référence / Référence.HTML

nsnumber est une classe qui vous aide à stocker des types numériques comme objet. Il dispose de méthodes de convertir entre différents types et méthodes pour extraire une représentation de chaîne de votre valeur numérique. Si vous utilisez une journée variable de type nsnumber * comme vous l'avez fait dans votre exemple, vous ne modifiez pas la valeur de la journée mais son adresse mémoire.


0 commentaires

0
votes

Tout dépend de votre besoin. Mais si l'API vous oblige à utiliser int em>, vous devez utiliser int em>. Il vous demande d'utiliser nsnumber em> Vous devez utiliser nsnumber em>.

Par exemple, si vous utilisez un uisegmentedControl em>, et vous voulez Sélectionnez un segment, puis, P>

[segmentedControl setSelectedSegmentIndex:aIntVar]; // Can not use NSNumber here
// or
[segmentedControl setSelectedSegmentIndex:[aNumber intValue]];


0 commentaires

8
votes

comme généralisation: il suffit de rester avec des types de pod jusqu'à ce que vous besoin utiliser une représentation basée sur un objet, tel que nsnumber . La performance est bien meilleure avec les gousses, mais vous aurez besoin nsnumber dans certains cas.

Dans certains cas, il peut être logique d'utiliser nsnumber à la place - ceci est typiquement lorsque vous réutiliser a nsnumber souvent - ceci est d'éviter de faire une tonne de duplicata nsnumber s. De telles occurrences sont pratiques uniquement au-delà de la sérialisation et des interfaces génériques Objc (liaisons, transformateurs, dictionnaires).


Mise à jour / Détails: Le temps d'exécution de l'OBJC sera dans certains cas, sur certaines architectures, et sur certaines versions du système d'exploitation substituer un pointeur Pointeur marqué représentant nsnumber S de type et de domaine spécifiques. Bien que la représentation interne ait changé depuis de l'origine de quelques années de retour, voici une bonne introduction au sujet: http://objectivistc.tumblr.com/post/7872364181/tagged-pointer-and-fast-pathed-cfnumber-integers-in . Lorsque cela peut être utilisé, cela vous évite d'opérations lentes telles que des allocations, un verrouillage et des ops Ref. Néanmoins, des pointeurs marqués sont incapables de représenter tous les nombres et introduisent les frais généraux. Vous devez donc toujours favoriser les produits de base sur nsnumber par défaut. Les pointeurs marqués sont une excellente optimisation, le cas échéant, mais sont loin d'être en concurrence avec les cométiches lorsque vous avez juste besoin d'un numéro .


2 commentaires

La grande chose est que KVC prend en charge l'autoboxage, c'est-à-dire une conversion entre types scalaires et nsnumber. Il est donc peu nécessaire d'utiliser NSNumber dans les propriétés.


Vous voudrez peut-être réviser cela compte tenu des implications des appareils 64 bits.