사용자가 페이지를 순환 할 때 (항상 동일한 순서로) 3 개의보기가 푸시되는 UINavigationController가 있습니다.이 뷰를 호출하여 views0, 1 및 2를 호출하여 탐색 컨트롤러 색인으로 정렬합니다. 보기는 스토리 보드에서 작성됩니다.어떻게 popToRootViewControllerAnimated가 작동하는지 확인합니까?
뷰 진행이 끝나고 사용자가 처음으로 돌아가고 싶을 때 나는 버튼 누름에 대한 응답으로 popToRootViewControllerAnimated : YES를 사용하고 UI는 view0으로 적절히 리턴한다. 그러나 때때로주기를 다시 거쳐 view1 (중간 뷰)이 완전히 dealloc'ed되지 않았 음을 분명히함으로써 앱 전체 알림에 대한 응답으로 "팬텀 (phantom)"로그 문을 얻게됩니다. 나는 xcode 4.2.1에서 iOS5 + 코드만으로 ARC를 사용하고 있으므로 ARC는 그 일들을 잘 처리해야합니다.
나는 ARC가 참조 횟수가 0으로 감소하지 않은보기를 해제하지 않을 것이라고 제안하는 게시물을 보았습니다. 그래서 수행 할 때 속성을 nil로 설정할 수있는 모든 작업을 수행했습니다. 마지막 뷰로 이동할 때 아무 것도 남지 않았 음을 보여줍니다 ... NavigationController 참조 뷰 1 밖에서는 아무것도 알지 못합니다. 좀비와 메모리 누수에 대한 응용 프로그램 프로파일 링은 아무 것도 산출하지 않습니다.
여전히 뷰를 참조 할 수있는 항목을보고/로그/디버깅하려면 어떻게해야합니까? dealloc을 막을 수있는 물건을 넣지 않고 성공적으로 dealloc을 수행했다는 것을 어떻게 알 수 있습니까?
view0이 스토리 보드에 "푸시"SEGUE를 사용하여 뷰 1을 밀어 :
내 코드 (본질적으로) 다음과 같다.
보기 1 :
- (void)viewDidLoad
{
[super viewDidLoad];
/* register as observer for some notifications */
/* set properties and format an image or two */
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
/* start some animation here */
}
- (void) receiveNotification {
NSObject *newObject = [[NSObject alloc] init];
[newObject doStuff];
/* Remove notification observers */
}
- (void)objectDelegateMethod:(NSDictionary *) dataReturned {
/* do stuff with dataReturned */
self.propertyName = dataReturned;
[self performSegueWithIdentifier:@"AllDone" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"AllDone"])
{
View2ViewController *destinationView = [segue destinationViewController];
destinationView.propertyMagic = self.propertyName;
[self setPropertyName:nil];
//do same with all other properties
}
뷰 2 : 나는 통지의 관찰자로 뷰 1을 제거하지 않는 경우, 상기 (거친) 구조를 감안할 때
- (void)viewDidLoad
{
/* display things based on self.propertyMagic */
}
- (IBAction)userStartsOverButton:(id)sender {
[self.navigationController popToRootViewControllerAnimated:YES];
}
, 그것은 응답 및 출력 계속 비록 내가 왜 그것이 dealloc'ed 않았는지 알 수 없지만 로그에. 옵저버를 제거 할 때도 앱 실행과 주기적으로 문제가 발생하여 메모리 사용량이 계속 증가합니다 (기기에서 누출이 감지되지 않음).
어떻게 알아낼 수 있습니까?
이것은 Obj-C의 비 ARC 환경에서 프로그래밍되지 않은 사람에게 정말 도움이되는 제안이었습니다. 내가 popToRootViewControllerAnimated를 실행하기 전에 view1에서 모든 하위 뷰를 제거하면 ARC는 해당 뷰를 dealloc합니다. 그러나 이상한 부분은 dealloc이 종종 최대 몇 분 지연된다는 것입니다 ... ARC에서 예상되는 것입니까? 자바에서는 가비지 수집 빈도 등을 조정할 수 있다는 것을 알고 있지만 ARC는 그보다 조금 더 깨끗하다고 생각했습니다. – Amos
또한 앱의 어느 곳에서나 view1에 대한 자체 작성된 참조가 없다는 점은 주목할 가치가 있습니다. 그것은 보일러 판 스토리 바드 (Storybard Segue)에 의해 인스턴스화되며 손은 비슷하지만 사용자 정의 세그먼트를 통해 view2에 대한 의무를 표시합니다. – Amos
... 나는 방금 쓰레기 수거에 대한 의견을 읽은 후에 이것이 잘못된 것이라고 생각했습니다. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1 짧은 시간 동안 view1에 붙드는 경우, 그렇지 않으면 즉시 해제 될 것입니다. 스토리 보드가 여전히 그것을 참조 할 수 있습니까? – Amos