2010-08-25 4 views
1

J'ai une classe personnalisée:NSMutableArray avec des objets personnalisés?

@interface Player : NSObject { 
    NSInteger mPlayerNo; 
} 

-(id) initWithNum:(NSInteger) playerNum; 

@implementation Player 

-(id) initWithNum:(NSInteger) playerNum 
{ 
    if(![super init]) 
    return nil; 
    ... 
    mPlayerNo=playerNum; 
    return self; 
} 

@end 

J'ai besoin du tableau des objets joueur dans l'autre classe du programme:

@interface Spec : NSObject { 
    NSMutableArray * mPlayers; 
    ... 
    } 

Donc, je suis en train de remplir mPlayers arr dans la méthode init la classe Spec comme ceci:

- (id)init { 
    if(![super init]) 
     return nil; 
    NSMutableArray * _array=[[NSMutableArray alloc] init]; 
    mPlayers=_array; 
    [_array release]; 
    Player * _player=[[[Player alloc] initWithNum:(NSInteger)1]autorelease]; 
    [mPlayers addObject:_player]; // crashes with EXC_BAD_ACCESS 

Cela ne fonctionne pas. Mais si je change

NSMutableArray * _array=[[NSMutableArray alloc] init]; 
    mPlayers=_array; 
    [_array release]; 

avec

mPlayers=[[NSMutableArray array]retain]; 

Tout fonctionne très bien. C'est quelque chose d'étrange pour moi. S'il vous plaît, aidez-nous à comprendre le problème avec alloc init.

Répondre

4

Le problème est que vous libérez votre matrice avant de l'utiliser.

NSMutableArray * _array=[[NSMutableArray alloc] init]; //Retain count of 1 

mPlayers=_array; //Still 1. 
//Adding a new pointer to the same object doesn't affect the object's retain count. 

[_array release]; //Now it's 0. Array is gone! 
2
NSMutableArray * _array=[[NSMutableArray alloc] init]; 
    mPlayers=_array; 
    [_array release]; 

Ici, vous créez un tableau, puis le relâchez immédiatement. Le + alloc implique une retenue et vous l'équilibrez par cette version.

L'affectation n'est pas pertinente.

2

Si vous attribuez le tableau que vous avez créé à mPlayers, cela ne touche pas le compte conserver. Si vous appelez ensuite release, le nombre de réceptions atteint zéro et l'objet est désalloué.

Comme une compréhension plus profonde de ce comportement est essentiel pour le développement Objective-C, vous pouvez jeter un oeil à l'Apple documentation fournit

Questions connexes