2011-12-22 3 views
1

내가 말하는 메시지가 :잠재적 메모리 누수가

- (NSString*) utf8String 
{ 
    return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding]; 
} 

어떻게 해결할 수 있습니까? 내가 utf8String 전화 라인에

- (NSString*) utf8String 
{ 
    return [[[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding] autorelease]; 
} 

내 응용 프로그램 충돌 : 나는 문을 변경하는 경우.

답변

2

변수가 사용되기 전에 해제되기 때문에 응용 프로그램이 충돌하는 것 같습니다. 환불 값을 바로 사용하지 않고 멤버 변수에 저장하는 경우 retain으로 전화하는 것이 좋습니다.

... 
myMemberVariable = [something utf8String]; 
[myMemberVariable retain]; 
... 

메모리 누수가 발생하지 않도록하려면 어딘가에서 멤버 변수를 해제해야합니다. 좋은 장소는 dealloc입니다.

- (void)dealloc { 
    if (myMemberVariable) [myMemberVariable release]; 

    [super dealloc]; 
} 

은 또한 아이폰 OS의 메모리 관리에 대한 몇 가지 자세한 정보를 얻을 수 Advanced Memory Management Programming Guide을 살펴 가지고 추천 할 것입니다.

3

코코아 이름 지정 규칙은 이름이 'init', 'copy'또는 'new'로 시작하는 메소드를 제외하고 모든 메소드가 자동 렌더링 된 객체를 반환 함을 제안합니다. 정적 분석기는이 사실을 알고 있습니다.

두 가지 선택 사항이 있습니다. 메서드의 이름을 -newUTF8String으로 바꿀 수 있습니다. 또는 autorelease 개체를 반환하고이 메서드의 반환 값을 저장할 때이를 유지할 수 있습니다.

후자를 선호하지만 두 코드 모두 유효한 코드입니다.