2011-07-31 1 views
0

내비게이션 기반 앱이 있습니다. 화면 목록에는 도서 목록이있는 UITableView이 있습니다. 책 목록은 HTTP 요청을 실행하여 동적으로 작성된 특성 인 NSArray에 있습니다. 리스트에있는 행 중 하나를 클릭하면 세부 사항 화면으로 이동합니다. 이 시점에서 메모리 경고가 있다고 가정 해 봅시다. 화면 으로 돌아 오면 viewDidUnload이 호출 되었기 때문에 NSArray이 없으므로 목록은 비어 있습니다.iOS 메모리 관리 - viewDidUnload

이 상황을 처리하는 올바른 방법은 무엇입니까? viewDidUnloadNSArray을 설정하지 않아야합니까?

답변

1

일반적으로 IBOutlet UI 요소의 속성 만 제외하면됩니다. -viewDidLoad에서 다시 만들 수있는 모든 것을 안전하게 정리할 수도 있습니다. 그러나 일반적으로이 메서드는 뷰 컨트롤러가 아닌 뷰와 관련된 메모리를 정리하고 해제하는 용도로만 사용됩니다.

+0

그래서 짧은 대답은 내가 바로, 전무로있는 NSArray를 설정하지해야한다는 것입니다? 이것은 응용 프로그램이 완료 될 때만 NSArray가 릴리스된다는 것을 의미합니까? – Adriana

+0

첫 번째 질문을 수정하십시오. 배열은 뷰 컨트롤러가 파괴 될 때 해제 될 것입니다 (여러분이'-dealloc'에서 그것을 풀 었다고 가정 할 때). 뷰 컨트롤러가 탐색 컨트롤러의 스택에 항상 있으면 배열은 앱이 끝날 때까지 존속합니다. –

+0

내 UIViewController 하위 클래스의'- (void) dealloc' 메서드에서'[super dealloc]'을 호출하므로 뷰 컨트롤러가 삭제됩니다. 마지막 질문 : 내 모델에'- (void) dealloc' 메서드를 정의해서는 안됩니다. 맞습니까? 그렇지 않으면 메모리 경고가있는 경우에 데이터가 손실 될 것입니다. 명확한 설명을 해주셔서 감사합니다 :) – Adriana

0

올바른 방법은 UIViewController에 데이터를 저장하는 것이 아니라 데이터를 관리하는 다른 개체에 데이터를 저장하는 것입니다.

viewcontroller는 모델과 화면 간의 링크 역할을합니다. 데이터를 저장하는 데 사용해서는 안됩니다.

+0

이것이 적절한 조언인지 모르겠습니다 - 데이터가 "저장"되어있는 곳이라면 적어도 뷰 컨트롤러에서 참조가 필요합니다. 지속되지 않는 임시 데이터의 경우 데이터는 힙에 저장됩니다. Adriana는 모델 클래스가 가져 오기를 추상화하는 데 사용되었는지 또는 모델 클래스에서 수행되었는지 여부를 지정하지 않습니다. –

+0

질문을하는 방법 (그리고 그것이 사실이라는 것)은 데이터가 가져 와서 뷰 콘트롤러에 저장된다는 느낌을줍니다. 나는 이런 종류의 코드를 아주 규칙적으로 만난다. 교양있는 추측이라고 부르십시오.) –

+0

그것이 맞다고해도, 묻는 질문은 다루지 않습니다. –

0

보통 void dealloc()에서 객체의 NS (Mutable) Array를 설정합니다. Nil 및 릴리스 (객체가 자동 릴리즈되지 않은 경우).

uinavigationcontroller를 사용하는 경우보기가 푸시되므로 세부보기에서 돌아올 때 일반적으로보기에 넣지 않는 한 이전 데이터가 유지됩니다.

내 생각에 http 요청에서 메모리를 확보하는 데 문제가있는 것 같습니다.

0

어레이가 viewDidLoad 섹션에 빌드 된 경우이 필드를 nil로 설정할 수 있습니다. 뷰를 리콜하면 다시 빌드됩니다.

일반적으로 viewDidLoad 섹션이나 xib 파일에서 다시 작성할 수있는 viewDidUnload에서 아무 것도 설정하지 않으려합니다.

나는 게으르게 초기화 추천 할 것입니다하지만이 같은 -의 viewDidLoad에서

- (NSArray *)bookArray { 
    if (bookArray == nil) { 
     bookArray = [[NSArray alloc] init]; 
    } 
    return bookArray; 
} 

다음 :

self.bookArray = [NSArray arrayWithOjects:...,nil];