2009-03-02 2 views
13

다음과 같은 방법이 있습니다.iPhone에서 NSString을 릴리스해야하는 경우

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

응용 프로그램이 충돌하면 aPais를 공개하지 않습니다. 나는 언제 그것을 사용했는지 어딘가에서 풀어야하는지, 만약 그렇다면 어떻게해야 하는지를 모른다. NSMutableArray를 릴리스하면 충분합니까? 아니면 그것을 통과하여 각 객체를 릴리스해야합니까?

그리고 내가 그것을 내놓지 않아도된다면 누가 공개 할 책임이 있습니까?

+0

메서드 이름 지정에 관한 참고 사항 : "getFoo"라는 메서드는 참조로 foo를 반환합니다. - (void) getFoo : (out NSMutableArray **) outArray. Cocoa 명명 규칙과 일관성을 유지하기 위해 메소드의 이름을 "paises"로 지정해야합니다. –

답변

16

epatel이 말했듯이, 특정 문자열을 공개 할 필요가 없습니다. 좀 더 적극적으로 원한다면, 당신은 대신이 작업을 수행 할 수 있습니다 :

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

요약 :

  • [[있는 NSString의 ALLOC] initWith ...] -> 당신은 해제하거나 오토 릴리즈해야합니다.

  • [NSString stringWith ...] -> 해제 할 필요가 없습니다.

- 편집 : paises에 대해 autorelease을 반환합니다. 객체를 반환 할 때 &을 초기화하면 항상 자동으로 풀어 놓습니다.

+0

고마워요. NSMutableArray를 수동으로 릴리스 하겠지만 autorelease가 더 나은 옵션입니다. 갈아 치울거야. – madelman

5

stringWithUTF8String:은 다음 이벤트 루프에서 Cocoa가 자동으로 해제 할 autorelease 문자열을 반환합니다. 그러나 문자열은 addObject: 일 때 배열에 유지됩니다 ... 배열에있는 한 문자열은 그대로 유지됩니다.

관련 문제