developer tip

-dealloc이 아닌-(void) viewDidUnload에서 언제 객체를 해제해야합니까?

copycodes 2020. 8. 15. 09:27
반응형

-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.


이는 일반적으로 @propertyas를 설정하기 때문에 "(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 is used to release all objects that were owned both by the view controller itself and the view. The reason: If a view controller holds references to childs of the view, i.e. a button, the referenced child views will not get released, because their retain count is >= 1. After they are released in -viewDidUnload, they can get freed up from memory.


Apple deprecated viewWillUnload, now you shoud use didReceiveMemoryWarning or dealloc to release your objetcs.

In iOS 6, the viewWillUnload and viewDidUnload methods of UIViewController are now deprecated. If you were using these methods to release data, use the didReceiveMemoryWarning method instead. You can also use this method to release references to the view controller’s view if it is not being used. You would need to test that the view is not in a window before doing this.


If the view controller is popped from the navigation controller stack and is not retained anywhere else, it will be deallocated, and dealloc will be called instead of viewDidUnload. You should release the views created in loadView in dealloc, but it is not necessary to set the variables to nil, because soon after dealloc is called the variables will no longer exist.


You can release any subviews you hold on to, for example that UIImageView you retained in your loadView method, or better yet the image that was on that UIImageView.

참고URL : https://stackoverflow.com/questions/1158788/when-should-i-release-objects-in-voidviewdidunload-rather-than-in-dealloc

반응형