сбой памяти iphone sharedAccelerometer - PullRequest
1 голос
/ 12 октября 2011

У меня есть фундаментальный вопрос об управлении памятью iPhone.

У меня есть объект со свойством 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 является указателем.Вы должны быть в состоянии установить указатель на ноль.Однако, это терпит неудачу с BAD_ACCESS, почти как его попытка установить sharedAccelerometer в ноль.

Может кто-нибудь объяснить мне, почему вершина верна, а вторая неверна?(Я знаю, почему не получается третья строка)

1 Ответ

0 голосов
/ 12 октября 2011

Ваше свойство accelerometer не нужно объявлять как retain: вы не вступаете во владение общим акселерометром при его использовании, поэтому вы не несете ответственности за сохранение этой ссылки. Если свойство объявлено как retain, вызов self.accelerometer = nil неявно освобождает старое значение свойства; казалось бы, что экземпляр UIAccelerometer игнорирует неявное сообщение -retain, но не игнорирует -release, следовательно, EXC_BAD_ACCESS. Переключите свойство на assign, и вы больше не увидите этот сбой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...