2012-06-18 2 views
2

저는 잠시 동안 해결책을 피하는 비교적 간단한 문제가 있습니다. 보기 컨트롤러 및 연결된 XIB가 있습니다. 보기 컨트롤러는 FooterViewController입니다. FooterViewController의보기가 tableview의 바닥 글보기로 설정됩니다.메모리에서 인스턴스 변수가 지워지지 않도록 경고합니다.

FooterViewController보기에는 사용자에게 피드백을 표시하기위한 레이블이 포함됩니다. 신청서에 따라 값이 변경 될 때까지이 라벨을 유지하고 싶습니다. 정상적인 상황에서 그렇습니다. 그러나 메모리 경고로 테스트를 시작한 후 메모리 경고에 대한 응답으로 뷰를 언로드 한 후 레이블이 지워진 것을 발견했습니다.

- (void)viewWillUnload 
{ 
    statusString = [statusLabel text]; 
    testInt = 5; 
    NSLog(@"View will unload; status string = %@; testInt = %d", 
      statusString, testInt); 

    [super viewWillUnload]; 
} 

참고 나는 또한 설정 한 : FooterViewControllerviewWillUnload 방법, 내가 statusString라는 인스턴스 변수에 레이블의 텍스트를 저장 : 여기

내가 문제를 해결하기 위해 지금까지 노력했습니다 무엇 FooterViewControllerviewDidLoad 방법 그리고 5

NSInteger testInt로 선언 다른 인스턴스 변수는, 나는 statusString에 레이블의 텍스트를 설정하려고 :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSLog(@"Just before setting label, statusString: %@; testInt: %d", 
      statusString, testInt); 
    [statusLabel setText:statusString]; 
    NSLog(@"View did load."); 
} 

그러나 이것은 작동하지 않습니다. 또한, 메모리 경고를 시뮬레이션 한 후 로그에, 나는 참조 :

View will unload; status string = Invalid IP address Error code: 113; testInt = 5 

("잘못된 IP 주소 오류 코드 : 113"참고 statusString에 대한 올바른 값),

그런 FooterViewController로 이동 한 후 다시, 나는 볼이 어떤 이유로, FooterViewController의 인스턴스 변수가 될 때보기로드 다시 초기화되고 있음을 보여주는 것

Just before setting label, statusString: (null); testInt: 0 

. 마지막주의 :이 메소드는 뷰가 다시로드되어야 할 때마다 호출되고 있습니다. 어쨌든보기는 NIB에서 다시 불러 와야합니다.

그래서, 내 질문은 다음과 같습니다

  1. 왜 이러한 인스턴스 변수가 무효 또는 언로드하고 뷰를 다시로드하는 과정에서 제로 것으로 나타합니까?
  2. 내가이 무효화의 원인이되는 무언가를 잘못하고 있다면, 그것은 무엇입니까?
  3. 내가 잘못하고있는 것이 아니며 정상적인 동작 인 경우 뷰로드간에 상태를 유지 관리해야합니까?

감사합니다, 라일리

답변

0

나는 무엇이 계속되고 있는지를 알아 냈습니다. 문제는 부모보기 컨트롤러의 viewDidLoad 메서드에서 FooterViewController에 대한 할당 및 초기화 메서드를 호출했기 때문입니다. 보기가 덤프되고 나중에 다시로드되면보기 컨트롤러가 다시 초기화됩니다. 이것은 원래의 FooterViewController을 파괴했습니다.이 인스턴스는 필자가 필요로하는 인스턴스 변수를 유지하고 새로운 VC로 교체했습니다.

이 솔루션은 초기화는 실행주기 당 한 번만 수행되었다 있도록 FooterViewController의 부모 VC의 init 방법 [[FooterViewController alloc] init]를 이동했다.

나는 내 교훈을 배웠다 : 실제로 그렇게하지 않는 한보기 컨트롤러를 다시 초기화하지 마십시오. 이와 같이, 부모 뷰 컨트롤러에서 이니셜 라이저로 호출 할 때 매우주의해야합니다.

두 명의 응답자가 도움을 주셔서 감사합니다. 나는 강한 속성으로 statusString을 선언 한

0

statusString가 약한 참조하지 강한 특성처럼 보인다. 뷰가 언로드 될 때 레이블로 할당 해제되는 레이블의 텍스트는 유지할 수 없습니다. 이것이 올바른 값 (레이블이 할당 해제되기 전에)을 먼저 얻은 다음 나중에 null (레이블이 할당 취소되고 약한 참조가 무효화 된 후)입니다. statusString을 강력한 속성으로 바꾸면 ARC 마법으로 더 이상 물지 않습니다.

+0

: '@property (비 원자 강한)는 NSString * statusString,' 하고 합성. 그래도 여전히 같은 문제가 발생합니다. 나는 이것이 정확히 무슨 일이 일어나고 있는지 확신하지 못한다. – ravron

+0

이제 이상한 상황입니다. 나는 명시적인 setter self.statusString = statusLabel.text를 사용 하겠지만, 직접적인 ivar의 영향 대신에, 볼 수는 있지만, 나는 당황 스럽다. 설정자가 뭔가를 변경하면 ARC 문서를 다시 읽어야합니다 .-) –

+0

동의. 나는 명시적인 setter :'self.statusString = [statusLabel text]'에 종속되었고 여전히 동일한 결과를보고있다. 나는 메모리 경고가 일반적으로 VC의 견해를 공개하지만 VC 자체는 공개하지 않는다는 인상하에있다. 나는 속 였는가? – ravron

0

viewDidUnload가 메모리 경고 발생시 호출되지 않을 것이므로 viewDidUnload 대신 didRecieveMemoryWarning을 사용해야 할 것으로 보입니다. 충돌이 앱을 완전히 종료하는 경우 coreData와 같은 것을 사용하여 디스크에 데이터를 작성해야합니다. 여기에 데이터를 저장 한 다음 뷰를 계속 열어 볼 수 있도록 슈퍼를 호출하십시오. 희망이 도움이됩니다.

+0

흠, 좋은 생각. 당신은 내가'didReceiveMemoryWarning'을 사용해야한다는 것이 맞습니다. 그러나 이것은 내 문제의 근원이 아닙니다. 그래도 헤드 업에 감사드립니다! – ravron

+0

나는이 솔루션을 테스트했고 도움이되지 않았다는 것을 분명히해야합니다. 또한, 내 문제에 대한 실제 원인과 해결책을 찾았으며 SO가 나를 요구하는 8 시간 대기 후에 자체 게시 할 예정입니다. 저의 낮은 평판을 저주하십시오! – ravron

관련 문제