50 votes

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

D'après les discussions du forum , la différence réside dans le facteur de performance, allocWithZone: allouera de la mémoire à partir d'une zone de mémoire particulière, ce qui réduira les coûts de permutation.

En pratique, pratiquement aucune chance d'utiliser allocWithZone:, n'importe qui peut donner un exemple simple pour illustrer le cas d'utilisation de allocWithZone:?

Merci,

47voto

d11wtq Points 17790

Quand un objet en crée un autre, c'est parfois, une bonne idée de faire en sorte ils sont tous deux affectés de la même région de la mémoire. La zone méthode (déclarée dans le NSObject protocole) peut être utilisé à cette fin; il les rendements de la zone où le récepteur est situé.

Cela me suggère que votre ivars, et tous les objets de vos classes "créer" eux-mêmes pourraient faire usage de l' +allocWithZone: de cette manière, de faire 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;
}

30voto

Rivera Points 4219

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.

5voto

Un bon exemple d'utilisation de allocWithZone: quand vous êtes à la mise en œuvre de la NSCopy protocole, ce qui vous permet de rendre vos objets personnalisés copiable (copie / copie par valeur) comme:

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

Le NSCopy protocole permet de s'assurer que vous mettre en œuvre une méthode:

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

Lors de la copie d'un objet de la "copie" message de vous envoyer en tant que ci-dessus (1) est converti en un "copyWithZone: le message de la" derrière les scènes et les appels de votre méthode (2). aka vous n'avez pas à faire tout pour obtenir une zone de vous-même.

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

Ceci 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 allocWithZone est réellement utilisée.

2voto

Felix Points 195

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X