Quelle est la différence entre alloc et allocWithZone :?

À partir de la discussion sur le forum , il semble que la différence réside dans le facteur performance, allocWithZone: alloue de la mémoire à une zone de mémoire particulière, ce qui réduit les coûts de permutation.

En pratique, presque aucune chance d’utiliser allocWithZone:, n’importe qui peut donner un exemple simple pour illustrer quel cas utiliser allocWithZone:?

Merci,

Lorsqu’un object en crée un autre, c’est parfois une bonne idée de s’assurer qu’ils sont tous deux alloués depuis la même région de mémoire. La méthode de zone (déclarée dans le protocole NSObject) peut être utilisée à cette fin; il renvoie la zone où se trouve le récepteur.

Cela me suggère que vos ivars, et tous les objects que vos classes “créent” eux-mêmes, pourraient utiliser +allocWithZone: de cette manière, pour créer les instances qu’ils créent dans la même zone.

 -(id)init { if (self = [super init]) { someIvar = [[SomeOtherClass allocWithZone:[self zone]] init]; } return self; } 

De la documentation d’Apple:

Cette méthode existe pour des raisons historiques; Les zones de mémoire ne sont plus utilisées par Objective-C.

Un bon exemple d’utilisation de allocWithZone est lorsque vous implémentez le protocole NSCopy, ce qui vous permet de rendre vos objects personnalisés copiables (copie profonde / copie par valeur) comme:

 (1) ClassName *newObject = [currentObject copy]; //results in newObject being a copy of currentObject not just a reference to it 

Le protocole NSCopy garantit que vous implémentez une méthode:

 (2) -(id)copyWithZone:(NSZone *)zone; 

Lors de la copie d’un object, le message ‘copy’ que vous envoyez comme ci-dessus (1) lorsqu’il est défini comme ‘copyWithZone envoie un message à la méthode (2). aka vous n’avez rien à faire pour obtenir une zone vous-même.

Maintenant que vous avez une “zone” envoyée à ce message, vous pouvez l’utiliser pour vous assurer qu’une copie est faite à partir de la mémoire dans la même région que l’original.

Cela peut être utilisé comme:

 -(id)copyWithZone:(NSZone *)zone { newCopy = [[[self class]allocWithZone:zone]init]; //gets the class of this object then allocates a new object close to this one and initialises it before returning return(newCopy); } 

C’est le seul endroit où je suis conscient que allocWithZone est réellement utilisé.

J’utilise allocWithZone dans singleton. Comme Forrest l’a mentionné, les variables créées allouées à partir de la même région de la mémoire. Ainsi, d’autres classes peuvent les utiliser ou y accéder depuis la même zone de mémoire. Économisez de l’espace mémoire lorsque vous exécutez votre application.

Dans la référence des fonctions de base , toutes les fonctions de la Zone sont maintenant précédées de l’avertissement ci-dessous que les zones seront ignorées.

Les zones sont ignorées sur iOS et l’exécution 64 bits sur OS X. Vous ne devez pas utiliser de zones dans le développement en cours.

 NSCreateZone NSRecycleZone NSSetZoneName NSZoneCalloc NSZoneFree NSZoneFromPointer NSZoneMalloc NSZoneName NSZoneRealloc NSDefaultMallocZone 

Même si la documentation Apple indique que allocWithZone:

existe pour des raisons historiques; Les zones de mémoire ne sont plus utilisées par Objective-C. Vous ne devez pas remplacer cette méthode.

et

Les zones sont ignorées sur iOS et l’exécution 64 bits sur OS X. Vous ne devez pas utiliser de zones dans le développement en cours.

En réalité, je l’ai remplacé dans une classe Objective-C (dans un projet Objective-C complet) et la méthode est appelée lorsque je fais [[Mylass alloc] init] même si la version est en cours d’exécution sur un iPhone 6s.

Mais je pense qu’il est préférable de suivre la documentation et de remplacer la méthode alloc au lieu de celle-ci car alloc peut certainement faire le même travail.