2011-08-09 2 views
0

문자열 1의 비트. (예 단순화) 다음 코드를 사용할 때 나는 죽은 저장 및 잠재적 인 누출 통보지고 유지 :Xcode에서 NSString의 Dead Store 및 잠재적 누설

int x = 0; 
NSString *aString = [NSString alloc]init]; <-- value store to 'aString' during its  initialization is never read 

if(x == 0) 
{ 
    aString = @"This is a string set by x being 0"; 
} else 
{ 
    aString = @"This is a string set by x being something else"; 
} 

aTextLabelOutlet.text = aString; 
[aString release]; 
<-- Potential leak of an object allocated online ... and stored into aString 

내가 정말 이해가 안 돼요. 일단 사용 후 해제되면 allocalled됩니다. 초기화 된 다음 항상 무언가가 입력되어 항상 읽혀집니다.

실제로 충돌이 일어나지 않았거나 실제로 메모리 누수가 발생하여 혼란 스럽습니다.

답변

6

if 부분에 aString에 할당 했으므로 aStringNSString을 할당하면 안됩니다.

이 충분해야한다 :

int x = 0; 
NSString *aString; 

if(x == 0) 
{ 
    aString = @"This is a string set by x being 0"; 
} else 
{ 
    aString = @"This is a string set by x being something else"; 
} 

aTextLabelOutlet.text = aString; 
+0

슈퍼 감사 중 하나를 해제 즉

NSString *aString = [[[NSString alloc]init]autorelease]; 

이상 사용을 할 것 모자 있도록 오토 릴리즈 문자열을 woulduse! 다음과 같은 의미입니다. NSString * aString; aString는 = @ "이는 문자열";' 가 equivilant이다 '는 NSString * aString = [이 NSString ALLOC] initWithFormat "이 문자열은"@]' 가 있지만 필요하지 않습니다 '[aString release]'명시 적으로 alloc이 호출되지 않았습니까? –

+0

@ 리차드 워싱턴 - AFAIK 예 – MByD

+0

감사합니다, 많이 apreciated –

0

문제는 당신이있는 NSString을 할당 한하지만 당신이 그것을 공개하지 않습니다. aString = @"..." 코드로 지정한 문자열을 해제하려고합니다. aString의 첫 임무는 다음 사용되지 않습니다으로 (문자열이 stsically 상수를 할당으로도 방출하지 않는) 다른 답변에서 언급 한 바와 같이

당신은

aString에게 가치를 부여 할 필요가 없습니다 문자열에 사용 된 값이 있으면 할당을 해제하고 놓아야합니다. 예 :

int x = 0; 
NSString *aString = [NSString alloc]init]; <-- value store to 'aString' during its  initialization is never read 

// do something with aString 
[aString release]; 

if(x == 0) 
{ 
    aString = @"This is a string set by x being 0"; 
} else 
{ 
    aString = @"This is a string set by x being something else"; 
} 

aTextLabelOutlet.text = aString; 

아니면 런타임이 constructer 클래스 메서드

NSString *aString = [NSString string];