2009-05-24 5 views
3

UIViews에 중첩되어있는 일부 UIImageView가 있습니다. 뷰 컨트롤러가 소유하고 있습니다. }} -viewWillDisappear 메서드가 호출 되 자마자 UIViews를 사용하여 UIImageViews를 모두 제거하여 메모리를 확보합니다.안전하게 화면에서 UIImageViews를 제거하여 메모리를 확보 할 수 있습니까?

UIImageViews를 하위 뷰로 포함하는 UIView에서 호출합니다. UIImageViews를 소유하고있는 것은 없습니다. 내가 가진 모든 UIImageViews 함께 그룹화하는 UIView 인스턴스 변수입니다.

그래서 전송할 때 보유 개수는 0이되어야합니다.하지만 더 많은 메모리가 확보된다는 보장은 아닙니다. 그래서 myUIView = nil로 설정했습니다. 도움이 되었습니까/유용합니까? 어떻게 안전하게 메모리를 확보 할 수 있습니까?

답변

3

(-viewWillDisappear이 아님,이 시점에서 여전히 화면 상에 있음)에서 가장 좋은 방법은 self.view = nil입니다. 그러면 뷰 컨트롤러 전체보기가 덤프되고 다음에 필요할 때 자동으로 다시로드됩니다.

해당 뷰에 IBOutlet이있는 경우 해당 뷰를 nil로 설정해야합니다. 그렇지 않으면 해제되지 않습니다. 이 같은 설정은 한 가정 :

@interface MyViewController : UIViewController 
{ 
    UIImageView *_imageView; 
} 
@property (readwrite, retain) IBOutlet UIImageView *imageView; 

@implementation MyViewController 
@synthesize imageView = _imageView; 

그런 다음 당신은 당신의`-viewWillDisappear에 self.imageView = nil를 호출해야합니다.

일반적으로 접근 자 및 -dealloc을 제외하고는 ivars에 -release을 호출하면 안됩니다. 그들을 해제하는 올바른 방법은 접근자를 사용하여 nil로 설정하는 것입니다.

retainCount가 1 일 때 -release을 조정하면 즉시 free()이 호출되어 메모리가 복구됩니다. 그러나 자동 회수 풀을 포함하여 다른 객체가 객체를 보유 할 수 있으므로 특정 시점에 보유 개수가 무엇인지 확실하지 않을 수 있습니다.

사람들이 변수를 해제하여 즉시 nil로 설정할 것을 권장합니다. 변수에 영향을주지 않습니다. 그것은 방금 발표 한 포인터를 쫓는 것을 막아 주므로 할당되지 않은 메모리를 가리킬 수 있습니다. 당신은 -viewDidDisappear 정말 >>> "당신이 당신의`-viewWillDisappear에 self.imageView = 전무를 호출해야 그런 다음"

[_stuff release]; _stuff = nil; 
[_otherStuff release]; _otherStuff = nil; 
+0

하지 않습니다 그래서 -dealloc에, 나는 다음과 같이 라인을 가지고? – Thanks

+0

죄송합니다; 뒤로. 보기를 삭제하는 것과 관련된 모든 사항은 viewDidDisappear에서 수행해야합니다. 당신은 물건을 떨어 뜨리기 시작하기 전에 당신이 오프 스크린 상태가 될 때까지 기다려야합니다. viewWillDisappear에 UI 구성 요소를 놓으면 애니메이션이 엉망이 될 수 있습니다 (viewWillDisappear와 viewDidDisappear 사이에서 애니메이션을 적용하기 때문에). –

관련 문제