2010-11-15 4 views
0

J'ai une méthode:problème avec manament mémoire en Objective-C

-(NSArray *)doSomething{ 

    NSArray *array = [[NSArray alloc] initWithObjects:@"Huy 1",@"Huy 2",@"Huy 3",nil]; 

    [array release]; 

    return array; 

} 

et

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSArray *array = [self doSomething]; 

    if(array&&array.count>0){ 

     NSLog([NSString stringWithFormat:@"%@\n",[array objectAtIndex:1]]); 

    } 
    else{ 

     NSLog(@"Null"); 

    } 

} 

Je pense que je libéré tableau sur doSomething() donc il ne reviendra pas NSArray que je créé sur faire quelque chose(). Je ne sais pas encore imprimer "Huy 2"? Quelqu'un peut me dire pourquoi?

Répondre

2
-(NSArray *)doSomething 
{ 
    NSArray *array = [[NSArray alloc] initWithObjects:@"Huy 1",@"Huy 2",@"Huy 3",nil]; 

    return [array autorelease]; 
} 

Memory Management Programming Guide

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSArray *array = [self doSomething]; 

    if([array count]) //if array is nil this will evaluate to false. If count is 0 this will evaluate to false too. 
    { 
     NSLog(@"%@\n", [array objectAtIndex:1]); //NSLog insert values for you 
    } 
    else 
    { 
     NSLog(@"Null"); 
    } 
} 

Si cela fonctionne avec release au lieu de autorelease il est probablement parce que la mémoire que le tableau a utilisé n'a pas encore être utilisé par autre chose. C'est juste un hasard. Je soupçonne que si vous allouez un objet après NSArray *array = [self doSomething]; vous obtiendrez des résultats inattendus.

+0

Merci pour votre aide :) –

1

Utilisez la méthode de la manière suivante:

-(NSArray *)doSomething{ 

    NSArray *array = [[NSArray alloc] initWithObjects:@"Huy 1",@"Huy 2",@"Huy 3",nil]; 

    return [array autorelease]; 

}