2011-09-03 3 views
0

우선 n00b입니다. 노력과 연구의 오랜 시간 후에 나는 어떤 외부 도움을 얻기로 결정했습니다. 내 프로젝트 : 나는 아이들을위한 책을 만들었습니다. 이제 코드를 분석하고 일부 누출을 제거하려고합니다 (잠시 후 레벨 1 + 2 크래시). 다음은 나의 코드입니다Xcode는 객체의 잠재적 누출을 나타냅니다.

- (void)loadView { 

    _oben = YES; 
    _unten = NO; 

    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 

    UIImage *cover = [UIImage imageNamed:@"Umschlag.png"]; //Here it says "Potential leak.. 
    //..allocated on line 141 (thats at self.view = [[UIView alloc] initWithFrame:... 
    image = [[UIImageView alloc] initWithImage:cover]; 
    image.frame = CGRectMake(0, 0, 768, 1024); 
    [self.view addSubview:image]; 
    [image release]; 

    UITextView *text1 = [[UITextView alloc] initWithFrame:CGRectMake(184, 700, 400, 100)]; 
    text1.backgroundColor = [UIColor clearColor]; 
    text1.textAlignment = UITextAlignmentCenter; 
    text1.text = NSLocalizedString(@"CoverTextKey1", nil); 
    [self.view addSubview:text1]; 
    [text1 release]; 

    [self addButtonNext]; 
    [self addSwipeDown]; 
    [self addSwipeUp]; 
} 

아이디어가 있습니까? 누군가 나를 도울 수 있으면 정말 멋지다! 미리 감사드립니다. Planky

답변

3

행에 할당 잠재적 누출 141 :

self.view = [UIView의 ALLOC] initWithFrame : [UIScreen mainScreen] applicationFrame];

그 선은 이고 위에 보류 alloc-init가 유지 오브젝트 (+1)를 반환하고 속성 세터는 객체 (+2)를 유지하기 때문에 객체.

당신은 임시 변수를 사용할 수 있습니다 ...

UIView *temp = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
self.view = temp; 
[temp release]; 

... 또는 오토 릴리즈는이 문제를 해결하려면 다음

이미지를 캐싱 잘못 무엇
self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease]; 
+0

@Planky 당신은 환영합니다 :) – albertamg

+0

감사합니다, 지금 나는 누락 된 모든 릴리즈에 넣고 autorelease를했고 모든 누출 가능성은 사라졌습니다. 슬프게도 여전히 충돌하지만 또 다른 주제입니다. 어쨌든 시간 내 주셔서 감사합니다! – Planky

+0

또 다른 대안은 속성이 아닌 인스턴스 변수에 할당하는 것입니다. 물론이 경우 속성에 현재 nil이 아닌 포인터가 포함되어 있지 않은지 확인해야합니다. (확실하지 않은 경우 속성에 nil을 먼저 할당하십시오.) –

-1

대신 + (UIImage *)imageWithContentsOfFile:(NSString *)path 또는 - (id)initWithContentsOfFile:(NSString *)path을 사용하십시오. 그들은 이미지를 캐시하지 않습니다. imageNamed: 않습니다.

+0

. 두 개 이상의 장소에서 동일한 이미지를 사용하면 하나의 메모리 만 사용합니다. 당신의 방법은 그것이 사용되는 곳마다 이미지가 메모리를 차지한다는 것을 의미합니다. – Abizern

+0

문제는 시스템이 내부적으로 UIImage 객체가 해제되고 dealloced 된 경우에도 해당 캐시를 해제하지 않는다는 것입니다. 매우 자주 이미지를 재사용 할 필요가없는 한, 많은 이미지가있는 경우'imageNamed :'를 사용하지 마십시오. http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/ – XMLSDK

+0

예 - 2009 년 블로그 게시물에 iOS2.x와 관련된 문제에 대해 말씀 드리겠습니다. iOS5 용으로 쓰는 동안 3.x로 고정되었습니다. 물론, 큰 이미지를 캐시에 두지 마십시오 (문서가 말한 것처럼).하지만 캐시의 객체에 대한 참조를 유지하면 클리어되지 않습니다. 따라서 didReceiveMemoryWarning에서 참조를 해제하면 캐시를 기회를 스스로 지 웁니다. 캐싱을 원하지 않지만 ** imageNamed : **를 사용하지 말라는 말은 잘못된 것입니다. – Abizern

관련 문제