как я могу сохранить объект UIAccelerometer? - PullRequest
0 голосов
/ 16 августа 2011

Я изучаю IOS программирование. но у меня проблема с UIAccelerometer.

здесь сначала код.

- (void)viewDidLoad {
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.delegate = self;
accelerometer.updateInterval =  kUpdateInterval;
[super viewDidLoad];
}

- (void)accelerometer:(UIAccelerometer *)accelerometer 
    didAccelerate:(UIAcceleration *)acceleration {

[(BallView *)self.view setAcceleration:acceleration];
[(BallView *)self.view draw];
}

первый вопрос - viewDidLoad, я использую метод sharedAccelerometer

и возвращает общий объект для системы.

когда viewDidLoad завершается, локальная переменная не исчезает, акселерометр исчезает ??

Я думаю, что когда я получу объект акселерометра, и он исчезнет.

потому что viewDidLoad закончен, и у меня нет переменной экземпляра об этом.

это просто локальная переменная.

секунда - метод делегата.

я говорю, accelerometer.deleate = self в viewDidLoad.

но у меня нет переменной экземпляра для акселерометра, поэтому

как вызывается этот метод, когда viewDidLoad заканчивается?

Я действительно не понимаю, как сохранить объект UIAccelerometer.

пожалуйста, помогите мне.

Ответы [ 3 ]

4 голосов
/ 16 августа 2011

[UIAccelerometer sharedAccelerometer] всегда будет возвращать один и тот же объект акселерометра ( singleton ), поэтому вы можете использовать его где угодно.

0 голосов
/ 16 августа 2011

Когда вы устанавливаете делегат объекта, вы увеличиваете его счетчик на единицу. Таким образом, даже если у вас есть локальная переменная accelerometer, которая выходит из области видимости после возврата из функции, класс, для которого объект UIAccelerometer был задан в качестве делегата, будет сохранять его до тех пор, пока этот класс не достигнет нулевого счетчика сохранения.

Лучший способ действительно сделать это, если вы хотите сохранить ссылку на объект, - это создать в верхней части вашего класса пустую категорию и объявить там ивар для вашего ускорителя.

@interface myClassWithUIAccelerator()
{
    UIAccelerator *accelerator;
}
@end

...

- (void)viewDidLoad {
    accelerometer = [UIAccelerometer sharedAccelerometer];
    accelerometer.delegate = self;
    accelerometer.updateInterval =  kUpdateInterval;
    [super viewDidLoad];
}
0 голосов
/ 16 августа 2011

Просто создайте UIAccelerometer свойство в вашем заголовочном файле

@property(nonatomic,retain) UIAccelerometer accelerometer;

И затем вы можете назначить его в вашем viewDidLoad следующим образом:

*accelerometer = [UIAccelerometer sharedAccelerometer];

Теперь вы можете получить доступакселерометр на self.accelerometer

Особый случай здесь:

Да, после выполнения viewDidLoad созданный вами объект акселерометра больше не будет доступен.- Хотя вы всегда можете позвонить из единственного поставщика [UIAccelerometer sharedAccelerometer].(Он всегда будет возвращать один и тот же объект)

Делегат обрабатывает вызовы / события определенного объекта в течение срока его жизни.

Таким образом, вы также можете использовать это утверждение - Убедитесь, что вы соответствуете UIAccelerometerDelegate Протокол для этого:

[UIAccelerometer sharedAccelerometer].delegate = self

...