2012-03-08 6 views
0

배경 -메모리 관리, ARC - 무!

프로젝트에서 자동 참조 계산을 사용하고 있습니다. 루트보기는 "슬라이드 쇼"목록을 보여주는 테이블보기 (마스터/세부 사항 설정)입니다. 표 셀을 클릭하면 뷰가있는 스크롤 뷰 (viewController.view)가 구성된 상세 뷰 ("슬라이드 쇼")로 이동합니다. 각 슬라이드 쇼에는 다양한 페이지 수를 샌드위치하는 앞 표지와 뒤 표지 (동일한보기 제어기가 다르게 형식화 됨)가 있습니다. 여기에 슬라이드 쇼를로드하는 코드입니다 :

- (void)loadScrollView 
{  
// The front and back cover are set in Interface Builder because they 
// are reused for every slide show, just labels are changed. 
[self.scrollView addSubview:self.frontCoverViewController.view]; 
[self.frontCoverViewController setCoverTitle:_data.name creationDate:_data.creationDate isFrontCover:YES]; 
[self.pagesArray addObject:self.frontCoverViewController]; 

for (int i = 0; i < [self getTotalNumberOfComps]; i++) 
{ 
    PageViewController *pageView = [[PageViewController alloc] init]; 
    pageView.data = [_compsArray objectAtIndex:i]; 

    [_scrollView addSubview:pageView.view]; 
    pageView.data.imgView = pageView.imageView; 
    pageView.slideShowViewController = self; 
    [_pagesArray addObject:pageView]; 
} 

[self.scrollView addSubview:self.backCoverViewController.view]; 
[self.backCoverViewController setCoverTitle:_data.name creationDate:_data.creationDate isFrontCover:NO]; 
[self.pagesArray addObject:self.backCoverViewController]; 

[self.scrollView bringSubviewToFront:_frontCoverViewController.view]; 
[self setCurrentPage:0]; 
} 

문제 -

그래서 임 내가 전무 필요하므로이 슬라이드 쇼보기 컨트롤러를 재사용하고 각 슬라이드 때문에 중간에 페이지를 다시 시도 쇼에는 다른 수의 슬라이드가 있습니다. 슬라이드 [PageViewController]는 ImageView가있는 뷰일뿐입니다. 그것은 더 많은 기능을 가지고 있으므로 컨트롤러가 필요하지만 V.C의 메인 디스플레이가 필요합니다. ImageView입니다. loadScrollView를 새 데이터로 다시 실행하기 전에 슬라이드 쇼를 "비우는"다음 방법을 만들었습니다.

내 주요 질문 내가 전무에 각 페이지의 이미지 뷰를 설정해야 할 수 있습니다 -

- (void)saflyEmptyScrollView 
{ 
for (int i = 0; i < [self.pagesArray count]; i++) 
{ 
    if (i == 0 && i == ([self.pagesArray count]-1)) { 
     CoverViewController *cover = (CoverViewController*)[self.pagesArray objectAtIndex:i]; 
     [cover.view removeFromSuperview]; 
    } else { 
     PageViewController *page = (PageViewController*)[self.pagesArray objectAtIndex:i]; 
     [page.view removeFromSuperview]; 
     page = nil; 
    } 
} 
self.pagesArray = nil; 
self.pagesArray = [[NSMutableArray alloc] init]; 
} 

큰 질문 : 여기에 비어있는 방법은? 또는 페이지 자체를 nil로 설정하면 해당보기 컨트롤러에서 사용되는 ImageView/Labels/etc에서 사용하는 메모리를 확보 할 수 있습니까?

나는 self.imageView = nil을 추가하려고 시도했다. PageViewController의 viewDidUnload 및 viewWillUnload 메소드 (한 번에 하나씩)와 페이지 설정 = nil이 페이지 언로드 메소드를 호출하지 않는다는 것을 깨달았습니다. 나는 메모리를 올바르게 풀어 줍니까?

나는 많은 기사를 읽었지만 Im이 가능한 최선의 방법으로 메모리를 관리하는지 확실하지 않습니다. 도와 줘서 고마워!

답변

6

일반적으로 일을 nil로 설정하지 않아도됩니다. 그리고이 특별한 경우에 아무것도 설정하지 않는 것은 아무 것도하지 않습니다.

변수 page이 즉시 이후에 범위를 벗어나기 때문에 라인 page = nil;이 중복됩니다. ARC는 이것을 알고 있으므로 이것을 nil로 설정할 필요가 없습니다.

self.pagesArray = [[NSMutableArray alloc] init];을 따르기 때문에 self.pagesArray = nil;은 중복됩니다. 자체적으로 두 번째 줄이면 충분합니다.

+0

두 번째 부분을 가져 주셔서 감사합니다. 배열을 다시 초기화하는 것이 비우는 것과 같습니다. 그래서 원하는 결과를 얻으려면 서브 뷰에서 각 페이지를 제거한 다음 목록을 지우거나 목록에서 페이지를 제거해야합니다. 이제는 아무 것도 참조하지 않기 때문에 - ARC가 메모리를 확보 할 수 있습니까? – RachelC

+1

나는 당신의 코드를 정확히 모르겠다. 그러나 부모 뷰에서 모든 하위 뷰를 제거하는 것으로 충분할 것으로 기대한다. 배열을 명시 적으로 제거 할 필요는 없습니다. 배열이 해제되면 ARC는 더 이상 참조가 없을 때 배열에서 내용을 해제합니다. 간단히 말해서, 괜찮아 보인다. 누수 도구로 앱을 프로파일 링하여 실제 누출이 있는지 확인하는 것이 좋습니다. –

+0

도움을 많이 주셔서 감사합니다. 나는 프로파일 링을 해왔다. 그러나 Im은 이것에 대해 새롭다. Im은 필자가 필요로하는만큼 정확하지 않기 때문에 나는 단지 확인하고 싶었다. 다시 한번 감사드립니다. @ – RachelC