2010-10-24 4 views
1

Cocoa Fundametals J'ai trouvé le code suivant:Subclassing de NSMutableArray

@interface ValidatingArray : NSMutableArray { 
    NSMutableArray *embeddedArray; 
} 
@end 

@implementation ValidatingArray 
- init { 
self = [super init]; 
if (self) { 
    embeddedArray = [[NSMutableArray allocWithZone:[self zone]] init]; 

    return self; 
} 
@end 

Mais je ne comprends pas cette ligne de code:

embeddedArray = [[NSMutableArray allocWithZone:[self zone]] init]; 

Pourquoi nous utilisons cette initialisation au lieu d'allocation mémoire simple:

embeddedArray = [[NSMutableArray alloc] init]; 

Répondre

3

Les zones de mémoire dans Cocoa sont utilisées pour mettre les objets associés à proximité en mémoire, pour essayer et réduisez le nombre de défauts de page nécessaires pour amener un objet et les choses qu'il utilise hors de l'échange. L'objet initialisé dans -init peut avoir été créé dans une zone personnalisée en utilisant +allocWithZone:, alors -init essaie de placer ses objets ivar dans la même zone pour respecter la signification des zones.

En pratique, cela se défend contre un cas qui se présente très rarement. Je me souviens avoir vu du code utilisant des zones personnalisées dans OpenStep, mais je n'ai jamais eu besoin d'utiliser des zones moi-même.

+2

Les zones sont effectivement déconseillées et doivent être entièrement ignorées. – bbum

+0

@bbum: cette dépréciation est-elle documentée? –

+0

Pas vraiment. Vous pouvez toujours utiliser des zones pour des choses, mais l'utilisation est limitée. Mélanger des zones avec Foundation et essayer de procéder à une désallocation en vrac (la plupart du point des zones) est une recette pour le désastre. – bbum