-deloc가 아닌 -(void)viewDidUnload에서 개체를 언제 릴리스해야 합니까?
무입니까는 입니까?-(void)viewDidUnload
에 좋습니까?
그냥 모든 걸 공개할 수는 없을까요?-dealloc
만약에 뷰가 언로드되었다면,-dealloc
어차피 불린다고요?
이미 지적된 것 외에도, 저는 배후에 있는 논리에 대해 더 자세히 설명하고 싶었습니다.-viewDidUnload
.
이를 구현하는 가장 중요한 이유 중 하나는UIViewController
하위 클래스에는 일반적으로 뷰 계층의 다양한 하위 뷰에 대한 소유 참조도 포함됩니다.은 이속은다통설수있다습니정될해를 통해 될 수 .IBOutlets
때으로 내부에서 로드할 때-loadView
를 들면예를 들어.
대소추권유에 의한 의 추가 UIViewController
뷰하기 위해 .UIViewController
그 자체는 여전히 해당 개체에 대한 미결된 참조도 포함하고 있습니다. 해제UIViewController
이러한 개체에 대한 소유권을 추가하면 해당 개체의 할당이 해제되고 사용 가능한 메모리도 확보됩니다.
여기서 릴리스하는 개체는 일반적으로 다음과 같은 경우 다시 생성되고 다시 설정됩니다.UIViewController
는 는뷰입니다.re-loaded
에서또의구통해현을는니브의 .-loadView
.
한참고는 다음과 .UIViewController
view
은 재은입니다.nil
이 메서드가 호출될 때까지.
설명서에 나와 있듯이 다음과 같습니다.
메모리가 부족한 상태에서 뷰 컨트롤러의 뷰 및 해당 뷰와 연결된 개체를 해제하여 메모리를 확보해야 할 때 호출됩니다.
상황에서 같은상서에황서▁in에.dealloc
호출되지 않았습니다.이 방법은 OS3 이상에서만 사용할 수 있습니다.아이폰 OS 2.x에서 같은 상황을 다루는 것은 정말 고통스러웠습니다!
2015년 7월 업데이트:주의해야 할 것은viewDidUnload
에서는 "는 더 에서 제거되지 이 되지 않습니다."라는 이유로 더 이상 되지 않습니다.라는 이유로 더 이상 사용되지 않습니다.그래서 현대적인 조언은 그것에 대해 걱정하지 말고 사용하라는 것입니다.dealloc
.
이는 일반적으로 다음을 설정하기 때문입니다.@property
~하듯이"(nonatomic, retain)"
사용자를 위해 생성된 세터는 현재 객체를 해제하고 인수(즉, 인수)를 유지합니다.
self.property = nil;
...다음과 같은 작업을 수행합니다.
[property release];
property = [nil retain];
따라서 메모리 관리(기존 개체를 해제)와 포인터를 0으로 할당(영점 포인터로 메시지를 보내면 영점 포인터가 반환되므로)이라는 두 가지 요소를 모두 제거할 수 있습니다.
도움이 되길 바랍니다.
그 것을 기억하라.viewDidUnload
보기가 아닌 보기 컨트롤러의 메서드입니다.뷰의 dealloc
보기가 언로드될 때 메서드가 호출되지만 보기 컨트롤러가 dealloc
메서드는 나중에 호출될 수 있습니다.
예를 들어 UIImagePickerController를 사용하여 사용자가 사진을 찍을 수 있도록 할 때마다 메모리 부족 경고가 표시되고 보기가 표시되지 않으면 보기가 언로드되고 그 후 다시 로드해야 합니다.
결론:
보기 컨트롤러에는 보기 속성이 있습니다.일반적으로 니브 또는 코드 조각이 이 보기에 다른 보기를 추가합니다.이는 다음과 같이 -viewDidLoad 메서드 내에서 자주 발생합니다.
- (void)viewDidLoad {
[super viewDidLoad];
[self createManyViewsAndAddThemToSelfDotView];
}
또한 니브 파일은 버튼을 만들어 뷰 컨트롤러의 뷰에 추가할 수 있습니다.
아이폰 OS 2.2에서 -did Receive Memory Warning이 시스템에서 호출되었을 때 메모리를 확보하기 위해 무언가를 해제해야 했습니다.전체 보기 컨트롤러의 보기를 해제할 수 있습니다.또는 대용량 메모리를 사용하는 콘텐츠일 수도 있습니다.
- (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에서 권장하지 않는 보기WillUnload입니다. 이제 Objetc를 릴리스하려면 ReceiveMemoryWarning을 사용하거나 할당 해제를 사용해야 합니다.
iOS 6에서 보기이제 UIViewController의 WillUnload 및 viewDidUnload 메서드는 더 이상 사용되지 않습니다.이러한 방법을 사용하여 데이터를 릴리스하는 경우 didReceiveMemoryWarning 방법을 대신 사용합니다.또한 이 방법을 사용하여 뷰 컨트롤러 뷰가 사용되지 않는 경우 뷰 컨트롤러 뷰에 대한 참조를 해제할 수 있습니다.이 작업을 수행하기 전에 보기가 창에 없는지 테스트해야 합니다.
View 컨트롤러가 탐색 컨트롤러 스택에서 팝업되고 다른 곳에 유지되지 않으면 할당이 해제되고 viewDidUnload 대신 dealloc가 호출됩니다.dealloc에서 loadView에 생성된 뷰를 해제해야 하지만, deloc를 호출한 직후에는 변수가 더 이상 존재하지 않기 때문에 변수를 0으로 설정할 필요는 없습니다.
loadView 메서드에서 유지한 UIImageView나 UIImageView에 있던 이미지와 같이 보유한 모든 하위 보기를 릴리스할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1158788/when-should-i-release-objects-in-voidviewdidunload-rather-than-in-dealloc
'programing' 카테고리의 다른 글
자바스크립트를 사용하여 파일을 읽고 쓰는 방법은 무엇입니까? (0) | 2023.07.31 |
---|---|
CSS를 사용하여 어떻게 특정 번호의 아이를 얻을 수 있습니까? (0) | 2023.07.31 |
jQuery를 사용하여 리디렉션을 따르도록 Ajax 요청을 방지하는 방법 (0) | 2023.07.31 |
페이지 새로 고침 시 선택한 부트스트랩 탭을 유지하려면 어떻게 해야 합니까? (0) | 2023.07.31 |
C float 비교 기능은 언제 사용합니까? (0) | 2023.07.31 |