2009-03-02 13 views
13

Mam następujący sposóbKiedy wydać NSString na 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; 
    } 

ja nie zwalniając aPais, bo jeśli to zrobić awarii aplikacji. Nie wiem, kiedy i czy mam go wydać gdzieś po użyciu, a jeśli tak, to jak mam to zrobić. Wystarczy zwolnić NSMutableArray wystarczy? Czy muszę go przemierzyć i zwolnić każdy obiekt?

A jeśli nie muszę tego wypuszczać, kto jest odpowiedzialny za wypuszczenie?

+0

Uwaga dotycząca nazewnictwa metod: W kakao metoda o nazwie "getFoo" zwraca foo przez odniesienie: - (void) getFoo: (out NSMutableArray **) outArray. Aby zachować spójność z konwencjami nazewnictwa Cocoa, powinieneś nazwać swoją metodę po prostu "paises". –

Odpowiedz

16

Jak powiedział epatel, nie trzeba wydawać tego konkretnego ciągu. Jeśli chcesz być bardziej aktywne, można to zrobić w zamian:

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

Podsumowując:

  • [[NSString alloc] initWith ...] -> Musisz zwolnić lub autorelease.

  • [Ciąg NSStringWith ...] -> Nie trzeba zwolnić.

- Edytuj: Dodano autorelease dla paises, ponieważ zwracasz go. Gdy zwrócisz obiekt, zawsze go autorelease, jeśli alokowałeś & go zainicjować.

+0

Wielkie dzięki. Uwalniam NSMutableArray ręcznie, ale autorelease jest lepszym rozwiązaniem. Zmienię to. – madelman

5

stringWithUTF8String: zwraca ciąg autoodlease, który zostanie automatycznie zwolniony przez Cocoa w następnym wydarzeniu. Ale ciąg jest również zachowywany w tablicy, gdy robisz addObject: ... tak długo, jak długo jest w tablicy, zostanie zachowany.

Powiązane problemy