0

사용자가 페이지를 순환 할 때 (항상 동일한 순서로) 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 않았는지 알 수 없지만 로그에. 옵저버를 제거 할 때도 앱 실행과 주기적으로 문제가 발생하여 메모리 사용량이 계속 증가합니다 (기기에서 누출이 감지되지 않음).

어떻게 알아낼 수 있습니까?

답변

1

누수 및 좀비를 실행 한 경우 누출 또는 과다 릴리스가없는 것 같습니다.

는 클래스에 빈 로깅 dealloc을 추가 할 수 있습니다하는 할당 해제는 ARC에서 발생 "을 참조하십시오"하려면 : 나는 아직도 그것을 참조 있었는지 안다면 훗은, 내가 그것을 nilling을 가지고 노는 것

 
- (void)dealloc 
{ 
    NSLog(@"%s:%d", __func__, __LINE__); 
} 
+0

이것은 Obj-C의 비 ARC 환경에서 프로그래밍되지 않은 사람에게 정말 도움이되는 제안이었습니다. 내가 popToRootViewControllerAnimated를 실행하기 전에 view1에서 모든 하위 뷰를 제거하면 ARC는 해당 뷰를 dealloc합니다. 그러나 이상한 부분은 dealloc이 종종 최대 몇 분 지연된다는 것입니다 ... ARC에서 예상되는 것입니까? 자바에서는 가비지 수집 빈도 등을 조정할 수 있다는 것을 알고 있지만 ARC는 그보다 조금 더 깨끗하다고 ​​생각했습니다. – Amos

+0

또한 앱의 어느 곳에서나 view1에 대한 자체 작성된 참조가 없다는 점은 주목할 가치가 있습니다. 그것은 보일러 판 스토리 바드 (Storybard Segue)에 의해 인스턴스화되며 손은 비슷하지만 사용자 정의 세그먼트를 통해 view2에 대한 의무를 표시합니다. – Amos

+0

... 나는 방금 쓰레기 수거에 대한 의견을 읽은 후에 이것이 잘못된 것이라고 생각했습니다. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1 짧은 시간 동안 view1에 붙드는 경우, 그렇지 않으면 즉시 해제 될 것입니다. 스토리 보드가 여전히 그것을 참조 할 수 있습니까? – Amos

0

확인할 수있는 한 가지는 다른 객체에 (strong) view1에 대한 포인터가 있는지 여부입니다. 그렇다면 (weak)으로 변경하거나 해당 참조를 유지하지 않는 것이 좋습니다. (view0과 view1 사이 및 view1과 view2 사이에 가능한 유지 사이클을 찾으십시오. 아마도 서로 참조를 유지하고있을 것입니다).

ARC는 다른 개체가 더 이상 소유하지 않으면 개체에서 해제됩니다. 그래서 당신은 또한 같은 view0에 -popToRootViewControllerAnimated: 방법에 덮어 쓰기를 시도하고 호출 할 수 view0는 뷰 1에 대한 참조를 유지하는 유일한 객체 인 경우

self.view1 = nil; 

를, 뷰 1은 (dealloced)을 출시한다.

+0

및/또는 약한 대 강한 것을 시도) – Amos

관련 문제