6
votes

La copie de Nsnumber n'alloue pas une nouvelle mémoire

Je suis en train de mettre en œuvre une méthode de copiewithzone pour une classe personnalisée d'une classe, dans laquelle un pointeur NSNUMBER a été déclaré (conserver) Propriété

new.num = [[[NSNumber alloc] initWithFloat:[num floatValue]] autorelease]


0 commentaires

4 Réponses :


-2
votes

Vous devez utiliser [[A Alloc] Initwithzone: zone] lors de la mise en œuvre du protocole NScopying.

Comme d'autres ont déclaré cependant, Nsnumber est immuable et renvoie donc le même objet.


3 commentaires

Les zones sont toutes sauf obsolètes. Peu importe.


Tandis que NScopying nécessite la méthode suivante ...- (ID) Copywithzone: (Nszone *) Zone, InitiPwithzone: La zone est ce que vous devriez faire. Cela n'avait pas besoin d'un bowvote par un tronçon de l'imagination!


initwithzone: n'existe pas. Vous voulez dire allocwithzone:



3
votes

nsnumber n'est pas mutable, il n'est donc pas nécessaire de forcer la copie physique.


2 commentaires

Nstring n'est pas mutable aussi, mais pourquoi cela pourrait être appliqué avec copie?


@TOM: à cause de nsmutableString apporter une mutabilité possible. Il n'y a pas d'équivalent nsmutablenumber donc il n'y a pas de besoin de préoccupation.



11
votes

Nsnumber est immuable. Faire une copie est inutile et, par conséquent, les cadres ne se souviennent que de soi lorsque la copie est invoquée.

Si une classe implémente NScopying, vous devez marquer la propriété comme copier (pas retenir ). -Copy sur les classes immuables ( nstring ) retournera simplement une référence à l'objet (avec un nombre de retenue cogné). Si vous avez passé une instance mutable, il sera copié à une instance immuable. Cela empêche une partie externe de changer l'état derrière le dos de votre objet.


3 commentaires

Mais qu'en est-il de Nstring, ce n'est pas aussi mutable.


Comme l'affirme Abizem dans l'autre réponse, Nsnumber est un poids volé. Si vous créez un tas d'instances séparées de [Nsnumber NumberBool: Oui], ils partageront généralement le même stockage sous-jacent pour l'objet Bool et Nsnumber qui le casse. Si vous créez un tas d'instances séparées de [Nstring StringwithUtF8String: «Oui»], ils auront généralement leur propre stockage séparé pour les caractères et l'objet Nstring qui les enfoncent. Les détails réels sont un peu plus compliqués (et ne font pas partie de l'interface publique), mais c'est l'idée de base.


Et sur Lion, c'est un poids volé pour environ 2 ^ 56 valeurs de valeur ... En fait, il n'y a même pas un singleton; Aucune allocation ne représente du tout les données.



10
votes

Non seulement Nsnumber immutable - Pour les valeurs basses, comme aussi un Flyweight .


0 commentaires