저는 잠시 동안 해결책을 피하는 비교적 간단한 문제가 있습니다. 보기 컨트롤러 및 연결된 XIB가 있습니다. 보기 컨트롤러는 FooterViewController
입니다. FooterViewController
의보기가 tableview의 바닥 글보기로 설정됩니다.메모리에서 인스턴스 변수가 지워지지 않도록 경고합니다.
FooterViewController
보기에는 사용자에게 피드백을 표시하기위한 레이블이 포함됩니다. 신청서에 따라 값이 변경 될 때까지이 라벨을 유지하고 싶습니다. 정상적인 상황에서 그렇습니다. 그러나 메모리 경고로 테스트를 시작한 후 메모리 경고에 대한 응답으로 뷰를 언로드 한 후 레이블이 지워진 것을 발견했습니다.
- (void)viewWillUnload
{
statusString = [statusLabel text];
testInt = 5;
NSLog(@"View will unload; status string = %@; testInt = %d",
statusString, testInt);
[super viewWillUnload];
}
참고 나는 또한 설정 한 : FooterViewController
의 viewWillUnload
방법, 내가 statusString
라는 인스턴스 변수에 레이블의 텍스트를 저장 : 여기
FooterViewController
의
viewDidLoad
방법 그리고 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에서 다시 불러 와야합니다.
그래서, 내 질문은 다음과 같습니다
- 왜 이러한 인스턴스 변수가 무효 또는 언로드하고 뷰를 다시로드하는 과정에서 제로 것으로 나타합니까?
- 내가이 무효화의 원인이되는 무언가를 잘못하고 있다면, 그것은 무엇입니까?
- 내가 잘못하고있는 것이 아니며 정상적인 동작 인 경우 뷰로드간에 상태를 유지 관리해야합니까?
감사합니다, 라일리
: '@property (비 원자 강한)는 NSString * statusString,' 하고 합성. 그래도 여전히 같은 문제가 발생합니다. 나는 이것이 정확히 무슨 일이 일어나고 있는지 확신하지 못한다. – ravron
이제 이상한 상황입니다. 나는 명시적인 setter self.statusString = statusLabel.text를 사용 하겠지만, 직접적인 ivar의 영향 대신에, 볼 수는 있지만, 나는 당황 스럽다. 설정자가 뭔가를 변경하면 ARC 문서를 다시 읽어야합니다 .-) –
동의. 나는 명시적인 setter :'self.statusString = [statusLabel text]'에 종속되었고 여전히 동일한 결과를보고있다. 나는 메모리 경고가 일반적으로 VC의 견해를 공개하지만 VC 자체는 공개하지 않는다는 인상하에있다. 나는 속 였는가? – ravron