2010-06-01 4 views
3

나는 아래와 같이의 ViewController 설정이있는 경우 :메모리 관리 & viewDidUnload?

@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> { 
    CLLocationManager *locationManager; 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    locationManager = [[CLLocationManager alloc] init]; 
} 

그것은 내가 모두 viewDidUnload &의 dealloc에 ​​자료를 추가해야 메모리 관리에 관해서?

-(void)viewDidUnload { 
    [locationManager release]; 
    locationManager = nil; 
    [super viewDidUnload]; 
} 


-(void)dealloc { 
    [locationManager release]; 
    [super dealloc]; 
} 

환호 게리

EDIT

:

[슈퍼 할당 해제가] 학장 코멘트 종류에 따라 아래로 이동.

+0

주목 - dealloc 메소드에서 [super dealloc]을 _last_ 행으로 지정해야합니다. 그렇지 않으면 메모리가 이미 다른 객체에서 사용되고 있기 때문에 locationManager를 해제하려고 할 때 충돌이 발생할 수 있습니다. (아주있을 법하지 않지만 조심해야 할 것이 있습니다) – deanWombourne

+0

딘 감사합니다. 실수하지 말고 감사드립니다. 감사합니다. – fuzzygoat

+0

@dean : locationManager의 메모리를 아직 놓지 않았다면 다른 객체에 어떻게 사용할 수 있습니까? (게시 된 원래 코드를 참조하십시오) – progrmr

답변

6

짧은 대답은 :

이있는 viewDidLoad (또는 XIB)에서 유지/생성하지 않는 한, viewDidUnload에 공개하지 않습니다.

긴 대답은 :

viewDidUnload는 뷰가 생성 될 때 당신이 만든 수도 아무것도 해제하는 데 사용됩니다 -이있는 viewDidLoad에서 일을 포함뿐만 아니라 포함하고 XIB 파일 내부에서 생성 함께 IBOutlet 속성. 이것들은 모두 release되고 viewDidUnload에서 nil로 설정되어야합니다.

다른 것들은 dealloc에서 해제해야합니다.

viewDidUnload를 호출하여 메모리를 확보하면 viewDidLoad 메서드에서 뷰를 완전히 다시 만들 수 있습니다.

+0

AnswerDidload에서 locationManager를 인스턴스화 했으므로 viewDidUnload (뷰가 언로드 된 경우)에서 해당 권한을 해제하고 뷰가 종료 된 상태에서 앱이 종료되는 상황에 대해 dealloc에서 해당 권한을 릴리스 할 수 있도록 해답을 명확히 할 수 있습니까? – fuzzygoat

+0

viewDidLoad에서 인스턴스화 한 다음 yes로 설정하면 viewDidUnload에서 릴리스합니다 (뷰가 다시로드 될 때까지 위치 업데이트를 원하지 않는다고 가정). 그리고 당신은 다시 맞습니다 - dealloc에서 그것을 풀어주세요 : – deanWombourne

+0

고맙습니다, 많이 감사합니다. – fuzzygoat

5

viewDidUnload에서 IBOutlet 속성을 nil로 설정하고 viewDidLoad으로 초기화되는 모든 항목을 설정해야합니다.

휴대 전화의 메모리가 부족하면 화면에 표시되지 않는 경우보기가 언로드된다는 것을 기억하십시오. 다음에 뷰가 다시로드되면 새 뷰가 IBOutlets에 연결되고 viewDidLoad가 다시 호출됩니다. 따라서 콘센트 속성을 viewDidUnload에 nil로 설정하여 메모리 사용 공간을 줄여야합니다.

0

녀석은 self.object = nil을하기 전에 [object release]하고 있습니다.

첫 번째 출시 버전은 무엇입니까? Apple 문서에서 변수에 아무런 영향을 미치지 않습니다 ... 맞습니다.

+1

인스턴스 변수가 @property (retain)로 선언 된 경우 [self setMyVariable : nil]; 그러면 이전 객체를 해제하고 nil을 유지합니다. 위의 예제에서 @property를 사용하지 않았으므로 수동 릴리즈와 무 적용입니다. – fuzzygoat

+0

locationManager = nil은 ivar에서 직접 작동하므로 릴리스되지 않습니다. 따라서 명시 적으로 해제하거나, 이전에 유지 된 값을 해제하려면 mutator ([self setLocationManager : nil] 또는 self.locationManager = nil)를 사용해야합니다. 필자는 자신의 예제 ([locationManager release], locationManager = nil)의 버전을 개인적으로 선호한다. –