[iphone] -dealloc이 아닌-(void) viewDidUnload에서 언제 객체를 해제해야합니까?
무엇에 -(void)viewDidUnload
좋은가요?
모든 것을 풀어줄 수는 -dealloc
없나요? 뷰가 언로드되면 -dealloc
어쨌든 호출 되지 않습니까?
답변
이미 표시된 것 외에도 -viewDidUnload
.의 논리에 대해 더 자세히 설명하고 싶었습니다 .
이를 구현하는 가장 중요한 이유 중 하나는 UIViewController
하위 클래스가 일반적으로 뷰 계층 구조의 다양한 하위 뷰에 대한 소유 참조를 포함 하기 때문입니다 . 이러한 속성은 IBOutlets
펜촉에서로드 할 때를 통해 설정 하거나 -loadView
예를 들어에서 프로그래밍 방식 으로 설정할 수 있습니다 .
하위 뷰의 추가 소유권은 뷰가 UIViewController
뷰 계층 구조에서 제거되고 메모리를 절약하기 위해 해제 된 경우에도 뷰에 의해 하위 뷰가 해제되는 경우에도 UIViewController
그 자체가 여전히 자체 미해결을 포함하고 있기 때문에 실제로 할당 해제되지 않습니다. 해당 개체에 대한 참조도 유지합니다. UIViewController
이러한 개체 의 추가 소유권을 해제하면 메모리를 확보하기 위해 할당이 해제됩니다.
여기서 해제하는 객체는 일반적으로 Nib 또는의 구현을 통해 UIViewController
뷰가 있을 때 다시 생성되고 다시 설정됩니다 .re-loaded
-loadView
또한 UIViewController
view
속성은 nil
이 메서드가 호출 될 때입니다.
답변
현상태대로 설명서를 말한다 :
뷰 컨트롤러가 메모리를 확보하기 위해 뷰 및 해당 뷰와 관련된 모든 객체를 해제해야 할 때 메모리 부족 상태에서 호출됩니다.
같은 상황에서 dealloc
되어 있지 했다. 이 방법은 OS3 이상에서만 사용할 수 있습니다. iPhone OS 2.x에서 동일한 상황을 처리하는 것은 정말 고통 스러웠습니다!
2015 년 7 월 업데이트 : viewDidUnload
“보기가 더 이상 메모리 부족 조건에서 제거되지 않으므로이 메서드가 호출되지 않기 때문에”iOS 6에서 더 이상 사용되지 않는다는 점에 유의해야합니다 . 따라서 현대적인 조언은 그것에 대해 걱정하지 않고 dealloc
.
답변
이는 일반적으로 @property
as를 설정하기 때문에 "(nonatomic, retain)"
생성 된 setter가 현재 개체를 해제 한 다음 인수를 유지합니다.
self.property = nil;
… 다음과 같은 작업을 수행합니다.
[property release];
property = [nil retain];
따라서 당신은 하나의 돌로 두 마리의 새를 죽이고 있습니다 : 메모리 관리 (기존 객체 해제)와 포인터를 nil에 할당합니다 (모든 메시지를 nil 포인터에 보내면 nil이 반환되기 때문입니다).
도움이 되었기를 바랍니다.
답변
viewDidUnload
이것은 뷰가 아니라 뷰 컨트롤러의 메서드 라는 것을 기억하십시오 . 뷰의 dealloc
방법은 전화를받을 때보기 언로드하지만, 뷰 컨트롤러의 dealloc
방법은 나중에까지 호출 할 수 없습니다.
메모리 부족 경고가 표시되고 뷰가 표시되지 않는 경우, 예를 들어 UIImagePickerController를 사용하여 사용자가 사진을 찍을 때마다 발생하는 경우 뷰가 언로드되고 그 후에 다시로드되어야합니다.
답변
결론:
뷰 컨트롤러에는 뷰 속성이 있습니다. 일반적으로 펜촉 또는 코드 조각은이보기에 다른보기를 추가합니다. 이것은 종종 다음과 같이 -viewDidLoad 메소드 내부에서 발생합니다.
- (void)viewDidLoad {
[super viewDidLoad];
[self createManyViewsAndAddThemToSelfDotView];
}
또한 nib 파일은 버튼을 생성하여 뷰 컨트롤러의 뷰에 추가 할 수 있습니다.
iPhone OS 2.2에서 -didReceiveMemoryWarning이 시스템에서 호출되었을 때 메모리를 확보하기 위해 무언가를 해제해야했습니다. 이해가된다면 전체 뷰 컨트롤러의 뷰를 해제 할 수 있습니다. 또는 메모리를 많이 사용하는 콘텐츠입니다.
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
이제 새로운 OS 3.0에는 -viewDidUnload 메서드가 있습니다.이 메서드는 메모리 부족으로 인해 뷰가 언로드되었을 때 시스템에서 호출됩니다.
-viewDidUnload는 뷰 컨트롤러 자체와 뷰가 소유 한 모든 개체를 해제하는 데 사용됩니다. 이유 : 뷰 컨트롤러가 뷰의 자식에 대한 참조 (예 : 버튼)를 보유하는 경우, 참조 된 자식 뷰는 해제되지 않습니다. 유지 횟수가 1보다 크기 때문입니다. -viewDidUnload에서 해제 된 후 해제 될 수 있습니다. 기억으로부터.
답변
Apple은 viewWillUnload를 사용하지 않습니다. 이제 didReceiveMemoryWarning 또는 dealloc을 사용하여 objetc를 해제하십시오.
iOS 6에서 UIViewController의 viewWillUnload 및 viewDidUnload 메서드는 이제 더 이상 사용되지 않습니다. 이러한 메소드를 사용하여 데이터를 릴리스하는 경우, 대신 didReceiveMemoryWarning 메소드를 사용하십시오. 이 메서드를 사용하지 않는 경우 뷰 컨트롤러의 뷰에 대한 참조를 해제 할 수도 있습니다. 이 작업을 수행하기 전에보기가 창에 없는지 테스트해야합니다.
답변
뷰 컨트롤러가 내비게이션 컨트롤러 스택에서 팝되고 다른 곳에서 유지되지 않으면 할당이 취소되고 viewDidUnload 대신 dealloc이 호출됩니다. dealloc의 loadView에서 생성 된 뷰를 해제해야하지만 dealloc이 호출 된 직후 변수가 더 이상 존재하지 않기 때문에 변수를 nil로 설정할 필요는 없습니다.