2012-01-09 1 views
1

Objective-C를 처음 사용하고 응용 프로그램과 같은 스프링 보드를 만들려고합니다. 그래서 나는 다른 UIViewController에서 여러개의 서브 뷰를 생성하는 루프를 만드는 UIScrollView를 얻었습니다.UIScrollView에서 루프가있는 하위 뷰를 추가하면 메모리 누수가 발생합니다.

int row = 0; 
int column = 0; 
int page = 0; 

for (int i = 0; i < 5; i++) { 

    icon = [[ProjectViewController alloc] init]; 

    icon.iconPath = @"icon.png"; 
    icon.iconTag = i; 

    int x = (1024 * page) + ((50 + (10 * column)) + (188 * column)); 
    int y = (40 + (150 * row)); 

    icon.view.frame = CGRectMake(x, y, icon.view.frame.size.width, icon.view.frame.size.height); 

    [self.scrollView addSubview:icon.view]; 

    // Add a new page if we reach the end of one 
    if ((column == 4) && (row == 3)) { 
     row = 0; 
     column = 0; 
     page++; 

     // Add a new line if we reached last column 
    } else if (column == 4) { 
     column = 0; 
     row++; 

     // Add a column otherwise 
    } else { 
     column++; 
    } 
} 

이 물건의 모든있는 viewDidLoad 방법에 간다 -

@implementation ProjectsListViewController { 
    ProjectViewController *icon; 
} 

:

여기 내 코드입니다. 앱을 실행하면 모든 것이 정상적으로 작동 할 때까지 아이콘이 있습니다. 그러나 가능한 한 메모리 누수 때문에 아이콘을 클릭하고 싶습니다 (다른보기로 밀어 넣으려면 버튼에 IBAction이 있습니다). 내 앱이 충돌합니다. 그것은 더 이상 subviews에 대한 참조가없는 것 같습니다.

유일한 해결책은 각 ProjectViewController를 NSMutableArray 안에 추가하는 것입니다. 이렇게하면 아이콘을 클릭하고 다른보기를 누를 수 있습니다.

누군가 내가 잘못하고있는 것을 설명 할 수 있습니까?

죄송합니다. 귀에 멍청한 소리가 들리면 배우려고합니다.

참고 : 저는 ARC를 사용하고 있습니다.

+0

IBAction이 ProjectViewController에 연결되어 있습니까? 그렇다면 그 것이 문제라고 생각합니다. 또한 "내가 찾은 유일한 해결책"이 효과가 있습니까? 아니면 지금까지의 유일한 아이디어입니까? –

+0

스택 추적을 제공해야합니다. 메모리 누수가 크래시의 소스가 아닙니다 (일반적으로) – Zepplock

+0

각 아이콘에 대해'addTarget'가 없습니다. 어디에서 설정 했습니까? –

답변

0

배열을 사용하여 만든 해결책 인 앤트 로인 (Antoine)은 그와 같이 유지합니다.


• 아이콘이 ProjectViewController (이 즉석에서 생성되는 자료 ARC에 의한되고있다)
모든보기에 icon.view를 추가하는 것으로 그 원인이됩니다 • 인 배열하지 않고 잘못 무슨 일이 일어나고 있는지에 대한 통찰력을 제공합니다 에 의해 유지가보기
아이콘의 액션이 트리거 •, 그것은 메시지에 더 이상 유효하지 ProjectViewController의 인스턴스를 시도했다

배열을 사용하여 (나는 그것이 속성) (강한 가정입니다), 각 인스턴스 ARC에 의해 배열에 추가 된 ProjectViewController의 아이콘이 해제되지 않고 아이콘의 작업이 트리거되면 해당 메서드는 유효한 개체.

0

에 연결되어 있고 IBAction에 연결되어있는 경우 이미지 대신 UIButton을 사용해야합니다. 그렇게하면 코드를 모듈화하여 두 개의 다른 객체와 동작을 관리하는 것에 대해 걱정할 필요가 없습니다.

또한, 당신은이 질문에 대한 최종 해답을 확인해야합니다 : 대신 Why does static NSString leak?

0

:

icon = [[ProjectViewController alloc] init]; 

을 내가 할 것 :

ProjectViewController *projectViewController = [[ProjectViewController alloc] init]; 

새를 만드는이 방법을 루프를 통해 매번 ProjectViewController의 인스턴스를 가져오고, 다른 방법은 매번 동일한 UIViewController를 다시 할당합니다.

+0

ARC를 사용하는 경우 릴리스를 호출 할 필요가 없습니다. – madmik3

+0

와우, 나는 그것을 보지 못했습니다. 죄송합니다. 그에 따라 코드를 업데이트했습니다. 감사합니다 –

1

루프 외부의 아이콘 클래스를 참조하는 것이 아무것도없는 경우 ARC에서 수집합니다. 그래서 목록에 추가하면 문제가 해결됩니다. 아이콘보기를 목록에 추가하여 참조되도록합니다. 아이콘 자체는 ​​추적 할 수 없습니다.

+1

iOS의 가비지 수집? –

+0

아이콘 개체가 루프 끝에서 범위를 벗어납니다. 배열이나 사전에서 아이콘 객체를 관리해야 아이콘 객체가 해제되지 않습니다. – bbarnhart

+0

죄송합니다. ARC가 GC가 아닙니다. – madmik3