2011-04-20 2 views
1

우선, 영어 (미안)와 초보자 인 것에 대해 유감스럽게 생각합니다. learnign 용으로 두 번째 iPad 앱을 개발 중이며 메모리 관리에 문제가 있습니다. 나는 약 한 달 동안이 문제에 직면하고있다. 그래서이 위대한 공동체의 전문가가 나를 조금 도와 줄 수 있다고 생각했다.컨트롤러를 해제하거나 출시하지 않음

내 시나리오 :

간단한 전자 책 응용 프로그램입니다. 사용자가 두 개의 모달보기를 열 수있는 기본보기가 있습니다. 주요 문제는 모달보기 중 하나입니다. 거기에는 모든 페이지를 관리하는 scrollview가 있습니다. 지금은 12 페이지가 있습니다. 나는 모든 것을 풀어 내려고 노력했지만 메모리에 남아있는 것은 악기 메모리가 계속 커지기 때문에 모달보기를 무시하고 몇 번이나 돌아와서 충돌합니다. 페이지는 별도의 xib이며 다음 방법으로로드합니다.

- (void)loadScrollViewWithPage:(int)page { 
if (page < 0) return; 

if (page >= MyNumberOfPages) return; 

if ((NSNull *)controller != [NSNull null]) { 

    NSString *className = [NSString stringWithFormat:@"Pagina%d", page]; 
    Class myClass = NSClassFromString(className); 

    controller = [[myClass alloc] initWithNibName:className bundle:nil]; 

// I have tried autorelease and even retain] autorelease. 

      [viewControllers replaceObjectAtIndex:page withObject:controller]; 

    CGRect frame = scrollView.frame; 
    frame.origin.x = frame.size.width * page; 
    frame.origin.y = 0; 
    controller.view.frame = frame; 
    if (page != 0){ 
    controller.view.tag = page; 
    }else { 
     controller.view.tag = 9999; 
    } 

    [scrollView addSubview:controller.view]; 
    [scrollView sendSubviewToBack:controller.view]; 

      [controller release]; 


    } 
} 

로드 할 때마다 3 페이지 씩로드합니다. 나는 (로드 3 주위의 것들에 대한) (제거하거나 제거)들을 이런 식으로 언로드하려고 :

[viewControllers removeObjectAtIndex:pagi - 2]; 
[[scrollView viewWithTag:pagi - 2] removeFromSuperview]; 

그래서 나는이 문제를 가지고 ... 내가 컨트롤러를 놓으면 난에서 뭐하는 거지로 위의 방법을 사용하면 일부 페이지의 IBActions에서 앱이 다운됩니다. 그러나 어쨌든 내가 그것을 풀어주고 IBActions를 없애면 기억이 계속 커지게됩니다. Instruments에서는 누출은 보이지 않지만 메모리가 1MB 또는 2MB 증가하면 충돌이 발생합니다.

나는 viewDidUnload와 deallocs의 모든 페이지를 로깅했으며 메모리 경고가있을 때만 언로드합니다.

마지막으로, 나를 위해 더 이상한 것은, [컨트롤러 릴리스]를 사용하지 않으면; 앱이 충돌하지 않고 더 많은 시간을 머물게됩니다. 그러나 물론, 그들은 dealloc하지 않습니다.

이 방법에 문제가있을 수 있다고 생각하지만 도움이된다면 코드의 더 많은 부분을 업로드 할 수 있습니다. 여기 너무 길지 않게하는 것입니다.

아이디어가 있으십니까?

답변

0

안녕하세요. 먼저 영어가 나쁘지 않다고 말해야합니다. 나는 스위스 출신이고 만약 당신이 스페인어라고 말하지 않았다면, 나는 그것을 알아 채지 못했을 것입니다. ;-)

일반적으로이 응용 프로그램 시점에서 컨트롤러를 릴리스해야한다고 말할 수 있습니다. 위의 몇 줄을 전화하면

[[myClass alloc] initWithNibName:className bundle:nil]; 

그래서 할당 했으므로 놓아야합니다. alloc, retain 또는 copy를 사용하면 이러한 객체를 해제 할 책임이 있습니다.

하지만 문제가 무엇인지 추측 할 수 있습니다. controller을 어떻게 정의 했습니까? 그것은 iVar 또는 속성입니까? 속성 인 경우 "이전"값이 해제되지 않기 때문에 메모리 관리에 문제가 있습니다. 이 경우 controller 대신 self.controller을 사용하십시오.

기타이 코드 만 사용 가능한 응용 프로그램이 왜 작동하지 않는지 상상할 수 없습니다. ;-)

산드로 마이어

+0

'[컨트롤러 출시]'라인의 마지막 몇 ... – jv42

+0

매우 산드로을 주셔서 감사합니다. 컨트롤러는 @interface에 \t으로 정의됩니다. UIViewController * controller; @property가 아닙니다. – Jorge

+0

이 경우 내 예제가 도움이되지 않습니다. ^^ 나는 그것이 왜 충돌 하는지를 알 수 없다 ... –

관련 문제