2009-03-02 15 views
13

ho il metodoquando rilasciare un NSString in iPhone

-(NSMutableArray *) getPaises { 
    NSMutableArray * paises; 
    paises = [[NSMutableArray alloc] init]; 
    while(get new row) { 
     NSString *aPais = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
     [paises addObject:aPais]; 
    } 
    return paises; 
    } 

io non sto liberando l'APAIS seguente, perché se lo faccio l'applicazione si blocca. Non so quando o se dovrei rilasciarlo da qualche parte dopo averlo usato e, in tal caso, come farlo. Basta rilasciare NSMutableArray è sufficiente? O devo attraversarlo e rilasciare ogni oggetto?

E se non devo rilasciarlo, chi è il responsabile del rilascio?

+0

Una nota relativa alla denominazione del metodo: In Cocoa, un metodo denominato "getFoo" restituisce foo in base al riferimento: - (void) getFoo: (out NSMutableArray **) outArray. Per essere coerenti con le convenzioni di denominazione del cacao, dovresti nominare il tuo metodo semplicemente "paises". –

risposta

16

Come diceva epatel, non è necessario rilasciare quella stringa particolare. Se si voleva essere più proattivi, si potrebbe fare questo, invece:

-(NSMutableArray *) getPaises { 
    NSMutableArray * paises; 
    paises = [[[NSMutableArray alloc] init] autorelease]; 
    while(get new row) { 
     NSString *aPais = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
     [paises addObject:aPais]; 
     [aPais release]; 
    } 
    return paises; 
} 

In sintesi:

  • [[NSString alloc] initWith ...] -> È necessario rilasciare o autorelease.

  • [NSString stringWith ...] -> Non è necessario rilasciare.

- Edit: Aggiunto autorelease per paises, come lo si restituisce. Quando si restituisce un oggetto, autorizzarlo sempre automaticamente se si dispone di allocare & inizialo.

+0

Grazie mille. Sto rilasciando manualmente NSMutableArray, ma l'autorelease è un'opzione migliore. Lo cambierò. – madelman

5

stringWithUTF8String: restituisce una stringa di autorelease che verrà rilasciata automaticamente da Cocoa nel successivo eventloop. Ma la stringa viene mantenuta anche nell'array quando lo si fa addObject: ... così finché è nell'array verrà mantenuto.