2009-08-03 2 views
2

NavigationController에 밀어 넣을 수있는 About 뷰가 있습니다. 이 뷰에는 IBOutlet에 연결된 UILabel이 하나 있습니다. viewDidLoad에서 UILabel에 번들 버전 번호 (문자열)를 채 웁니다.왜 Instruments는 이것이 메모리 누수라고 생각합니까?

viewDidLoad { 
    [super viewDidLoad]; 

    self.title = @"About"; 
    // Line below is the suggested culprit *** 
    NSString *versionLabel = [[NSString alloc] initWithFormat:@"Version %@", 
           [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey]]; 

    self.applicationVersion.text = versionLabel; 
    [versionLabel release]; 
    versionLabel = nil; 
} 

나는 그것이 라인에 그렇지 않으면있는 NSString가 아닌 것을 제안한다 있으리라 믿고있어 ...

내 질문

은 왜 - : 악기 테스트는 주석으로 표시된 라인에서 메모리가 누수되는 것을 제안 ?

답변

0

는 실제로 유출 된 mainBundle 또는 infoDictionary있을 수 있습니다 - 시스템이 그 중 하나 또는 기타를 캐싱함으로써 그들이 만들어지는 다음 릴리스되지 않을 가능성이있다. 당신의 코드를 아래 applicationDidFinishLaunching에 추가

시도 :

[[NSBundle mainBundle] infoDictionary]; 
다른 코드없이

볼 경우 누수의 위치로 그 라인에 누수 지점. 이 경우 캐싱이 문제이므로 무시할 수 있습니다.

+0

감사합니다. 나는 AboutView에 들어갈 때마다 5 번이나 6 번에 하나씩 만 링크를보고 있습니다 ... – ShogoDodo

+0

당신의 의견은 올바른 길로 나를 잡았습니다. Peter – ShogoDodo

0

당신도 단순히는 NSString 클래스 (안 인스턴스)에 작용하는 다음과 같은 방법을 사용,이 경우는 NSString의 인스턴스를 만들 필요가 없습니다 : 당신이있는 NSString이 방법을 사용하는 경우

NSString *versionLabel = [NSString stringWithFormat:@"Version %@", 
              [[[NSBundle mainBundle] infoDictionary] 
              objectForKey:(NSString*)kCFBundleVersionKey]]; 

을 메모리가 할당되지 않았으므로 versionLabel을 릴리스 할 필요가 없습니다.

+0

원본 코드와 동일한 코드가이 코드에 할당됩니다. 할당 된 NSString 인스턴스는 자동으로 자동 등록됩니다. –

+0

그것이 실제로 누출을 조사하기 전에 제가 가지고있는 방법입니다. – ShogoDodo

2

내 의심 당신이 applicationVersion UILabel의 유출하고 있다는 점이다. 그러면 문자열이 부산물로 유출됩니다. iPhone에서 가장 일반적인 이유는 NIB memory management rules을 따르지 않았기 때문입니다.

+0

Nib 메모리 관리 규칙에 따르면 UIViewController가 setView로 dealloc을 구현하므로 setView에서 IBOutlet을 릴리스해야합니다 (뷰가 nil 인 경우). viewDidLoad, setView 및 Dealloc에 ​​NSLog 메시지를 추가하면이를 관찰하지 않습니다. 내가 관찰 한 것은 dealloc이 불려지는 것입니다. setView에서 볼 수있는 유일한 로그 메시지는 Xib가 ???? ???? – ShogoDodo

관련 문제