2009-03-02 21 views
13

Tengo el siguiente métodocuándo liberar un iPhone NSString en

-(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; 
    } 

No estoy liberando el APAIS, porque si lo hago la aplicación se bloquea. No sé cuándo o si debo liberarlo en algún lugar después de usarlo y, de ser así, cómo lo hago. ¿Simplemente liberar el NSMutableArray es suficiente? ¿O debo atravesarlo y liberar cada objeto?

Y si no tengo que liberarlo, ¿quién es el responsable de la liberación?

+0

Una nota con respecto a la denominación del método: En Cocoa, un método llamado "getFoo" devuelve foo por referencia: - (void) getFoo: (out NSMutableArray **) outArray. Para ser coherente con las convenciones de nombres de Cocoa, debe nombrar su método simplemente "paises". –

Respuesta

16

Como dijo epatel, no necesita liberar esa cadena en particular. Si quería ser más proactivo, se puede hacer esto en su lugar:

-(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; 
} 

En resumen:

  • [[alloc NSString] initWith ...] -> Debe liberar o autorelease.

  • [NSString stringWith ...] -> No es necesario liberar.

- Editar: Añadido autorelease de paises, como lo devuelva. Cuando devuelva un objeto, siempre vuelva a soltarlo si tiene alloc & init'd it.

+0

Muchas gracias. Estoy lanzando NSMutableArray manualmente, pero la liberación automática es una mejor opción. Voy a cambiarlo. – madelman

5

stringWithUTF8String: devuelve una cadena de liberación automática que será liberada automáticamente por Cocoa en el siguiente evento. Pero la cadena también se retiene en la matriz cuando hace addObject: ... por lo tanto, mientras esté en la matriz, se conservará.

Cuestiones relacionadas