2011-10-11 3 views
1

나는 기본적인 iPhone 메모리 관리 질문이 있습니다.iphone sharedAccelerometer 메모리 오류

은 내가 UiAccelerator의 속성을 가진 개체가 : .H :

@interface AccelerationController : NSObject <UIAccelerometerDelegate> 
{ 
    UIAccelerometer *accelerometer; 
} 

@property (nonatomic, retain) UIAccelerometer *accelerometer; 

하는 .m :

self.accelerometer = [UIAccelerometer sharedAccelerometer]; 
self.accelerometer.updateInterval = .5; 
self.accelerometer.delegate = self; 

내가 AccelerationController의 인스턴스를 해제

이의 dealloc이 호출됩니다.

- (void)dealloc 
{ self.accelerometer.delegate = nil; // WORKS 
    // self.accelerometer = nil;  WHY DOES THIS BLOW UP THE PROGRAM? 
    //[self.accelerometer release]; CANT DO THIS BECAUSE WE NEVER ALLOCATED IT 
    [super dealloc]; 
} 

나는 왜 dealloc 함수의 첫 번째 줄이 작동하지만 두 번째 줄을 이해하지 못합니다. self.accelerometer는 포인터입니다. null 로의 포인터를 설정할 수 있어야합니다. 그러나, BAD_ACCESS는 sharedAccelerometer를 0으로 설정하려는 것과 거의 같습니다.

탑이 정확하고 두 번째가 올바르지 않은 이유를 설명 할 수 있습니까? (제 3 번째 라인이 실패한 이유를 알고 있습니다)

+0

'self.accelerometer'에 액세스하기 위해 속성을 사용합니다. – Geoffroy

+0

또한 dealloc을 공백으로 남겨두면 가속도계를 해제하는 것처럼 보이며 BAD_ACCESS로 프로그램이 터집니다. – Tommy

+0

이 댓글을 볼 수도 있습니다. http://stackoverflow.com/questions/4044421/using -self-on-ivars-in-dealloc/4044731 # 4044731 – Suz

답변

0

accelerometer 속성을 사용하면 retain으로 선언 할 필요가 없습니다. 공유 가속도계를 사용할 때 소유권을 갖고 있지 않으므로 그 참조. retain으로 선언 된 속성을 사용하면 self.accelerometer = nil을 호출하면 속성의 이전 값이 암시 적으로 해제됩니다. UIAccelerometer 인스턴스가 암시적인 -retain 메시지를 무시하지만 -release을 무시하지 않으므로 EXC_BAD_ACCESS가있는 것으로 보입니다. 속성을 assign으로 전환하면 더 이상 충돌을 볼 수 없습니다.