2009-05-10 3 views
0

.NET 배경에서 나는 문자열 변수를 저장소에 재사용하는 데 익숙합니다. 따라서 아래 코드가 메모리 누수의 원인이 될 가능성이 있습니까? 이 코드는 iphone/itouch를 대상으로하므로 자동 GC가 없습니다. 나를 혼란 무엇NSString 변수 재사용 - 메모리 누수가 발생합니까?

-(NSString*) stringExample 
{ 
    NSString *result = @"example"; 
    result = [result stringByAppendingString:@" test"]; // where does "example" go? 

    return result; 
} 

는 NSStrings는 불변이지만, 당신은 아무 문제가있는 '불변'변수를 다시 사용할 수 있습니다.

답변

13

확실히 메모리 누수가 발생합니다. 재사용에주의를 기울여야합니다. NSString 객체의 실제 구현에 대해 많이 알 필요가있어서 "안전한지"여부를 결정해야합니다. 따라서 가비지 수집을 사용하지 않는 경우 안전을 위해 변수를 재사용해서는 안됩니다.

는 예를 들어, 완전히 안전한 :

NSString *result = @"example"; 
result = [result stringByAppendingString:@" test"]; 

초기 문자열 실제로 목표 -C 문자열 상수 때문에. 이 그러나, 메모리 누수가 발생할 것이다 : 그러니까 기본적으로

NSString *result = [NSString stringWithUTF8String:argv[0]]; 
result = [result stringByAppendingString:@" something more"]; 

그렇게하지 않으면 : 당신이 처음에 결과를 소유 한 적이 있기 때문에

NSString *result = [[NSString alloc] initWithUTF8String:argv[0]]; 
result = [result stringByAppendingString:@" something more"]; 

이, 그러나 안전 할 것 개체를 소유하고 있거나 가비지 수집을 사용하도록 설정 한 경우 안전합니다. 그러나 원래 개체를 소유하고 있고이 작업을 수행하면 메모리가 누수됩니다. 당신은 자신의 객체하지 않는, retain, init, copy, mutableCopy로 문의하거나 initWithSomething 방법 중 하나를 사용하지 않는 경우 : 제이슨의 대답에의 차임

2

.

따라서 코드에서 @"example"은 컴파일 된 코드에 저장된 문자열 상수이므로 출시 할 것이 없습니다. 그리고, 당신이 stringWithString을 반환하고 있기 때문에 당신은 그 객체를 소유하고 있지 않으며 앞으로 어떤 시점에서 그것이 자동으로 릴리즈 될 것이라고 추정 할 수 있습니다.

0

"확실히 메모리 누수가 발생할 수 있습니다."안전 "한지 여부를 결정하기 위해 기본 NSString 객체의 실제 구현에 대해 많이 알고 있어야하므로 재사용에주의해야합니다. , 가비지 콜렉션을 사용하지 않는다면, 안전을 위해서, 당신이 가지고있는 방식대로 변수를 재사용해서는 안됩니다. "

하지만 .Net 사용자는 메모리 누수의 원인이 될 불법 성명을 한 번도 사용하지 않았습니다! 위의 문은 확실히 합법적이며 @ "example test"라는 문자열을 반환합니다.

관련 문제