2009-09-28 4 views
0

S'il vous plaît considérer le code suivant:S'il vous plaît aidez-moi à résoudre retenir mystère dans iPhone?

//CallerClass.h 
@interface CallerClass : UITableViewController { 

    NSMutableArray *dataArray; 

} 
@property(nonatomic,retain) NSMutableArray *dataArray; 
-(void) setData; 

//CallerClass.m 
@implementation CallerClass 
@synthesize dataArray; 

-(id)initWithStyle:(UITableViewStyle)style { 

    if (self = [super initWithStyle:style]) { 
    [self setData]; 
    } 
    return self; 
} 

-(void) setData 
{ 
    dataArray = [CalledClass getData]; 
    [dataArray release]; 

} 


//CalledClass.h 
@interface CalledClass : NSObject { 

} 
+(NSMutableArray*) getData; 

//CalledClass.m 
@implementation CalledClass 

+(NSMutableArray*) getData 
{ 
    NSMutableArray* tempArray = [[NSMutableArray alloc] init]; 
    return tempArray; 
} 

Je veux savoir quel est le nombre de retenir pour tableauDonnees qui est TempArray. Est-ce qu'il est libéré. Je ne veux pas utiliser autorelease car je ne sais pas jusqu'à quelle période je vais en avoir besoin. Donc, je veux le libérer par moi-même. Quand j'attribue tempArray, son nombre de retenues devient 1. Mais quand je l'assigne à la variable d'instance dataArray dont la propriété est retain, le nombre de retain pour ce tableau devient 2 ou il reste 1. Comme libérant dataArray il libère de la mémoire.

Répondre

1

dataArray = [CalledClass getData]; Cela n'invoque pas l'attribut retain de la propriété. C'est juste une ancienne affectation d'iirc. [self setDataArray: [CalledClass getData]] donnerait un nombre de références de 2 sur votre tableau.

+0

Qu'en est-self.dataArray = [Appelé getData]; – rkb

2

Vous avez configuré votre propriété de conserver la valeur, mais vous n'êtes pas en utilisant les méthodes d'accès, mais définissez la variable d'instance directement à la place:

dataArray = [CalledClass getData]; 

ne sera pas gérer le compte retenir pour toi. Vous devez utiliser:

self.dataArray = [CalledClass getData]; 

Aussi, dans votre CalledClass, je change la méthode getData à ceci:

+(NSMutableArray*) getData 
{ 
    NSMutableArray* tempArray = [[NSMutableArray alloc] init]; 
    return [tempArray autorelease]; 
} 

Normalement, je vous attendez à obtenir un objet autoreleased retour d'une méthode avec un nom comme ça.

setData: devrait alors être quelque chose comme:

-(void) setData 
{ 
    self.dataArray = [CalledClass getData]; 
} 

ou vous pouvez vous en débarrasser entièrement et juste faire directement

self.dataArray = [CalledClass getData] 

en initWithStyle :.

En appelant self.dataArray au lieu d'attribuer directement à la variable d'instance, votre propriété tableauDonnees prendra soin de conserver et de libérer l'objet (car vous avez spécifié « retain » dans la déclaration de propriété)

+0

Donc, si je n'utilise pas autorelease et utilise self.dataArray = [CalledClass getData], quel sera le nombre de retenues. Combien de fois j'ai besoin de libérer les données. – rkb

+0

[[NSMutableArray alloc] init] vous donnera un tableau mutable avec un nombre de retenues de 1. self.dataArray = [CalledClass getData] augmentera le nombre de retenues à 2. Vous devrez ensuite le relâcher une fois. –

+0

Ohkk Tnx Thomas. Cela signifie que si je n'utilise pas de moi, cela n'augmentera pas le nombre de retenues. – rkb

Questions connexes