Выделить часто используемый класс только один раз? - PullRequest
1 голос
/ 20 июля 2009

Язык - Objective-C

Я использую класс SoundEffect для воспроизведения короткого звука. Я использую NSTimer для вызова этого метода:

- (void)count {

count++;
if (count == 16) {
    NSBundle *mainBundle = [NSBundle mainBundle];
    SoundEffect *soundEffect = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"beep" ofType:@"aif"]];
    [soundEffect play];
    count = 0;
}
seconds = seconds - 0.0625; // is equal to 1/16th of a second; effectively takes off one second per second
if (seconds == 0) {
    [timer invalidate]; // cancels timer
    [timer release];
}

[self convertSeconds];

}

(Подсчет только для того, чтобы звук воспроизводился с определенным интервалом.)

В любом случае, все работает нормально, но я думаю, что неэффективно продолжать выделять и инициализировать класс SoundEffect при каждом срабатывании моего таймера (что довольно часто). Есть ли способ, которым я могу aloc и init, когда я нажимаю кнопку, чтобы запустить таймер, и оставить его выделенным и инициализированным, так что все, что мне нужно сделать, это [soundEffect play]?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 20 июля 2009

Может быть, эта ссылка поможет: Создание экземпляра Singleton

3 голосов
/ 20 июля 2009

Вы можете сделать указатель на класс SoundEffect членом вашего собственного класса.

1 голос
/ 20 июля 2009

Если это звук, который вы будете использовать только внутри метода count, вы можете использовать статическую переменную, чтобы сделать трюк (обратите внимание, что это технически утечка памяти, поскольку объект никогда не освобождается)

- (void)count {

count++;
if (count == 16) {
        NSBundle *mainBundle = [NSBundle mainBundle];
        static SoundEffect * soundEffect = nil;
        if (soundEffect == nil)
           soundEffect = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"beep" ofType:@"aif"]];
        [soundEffect play];
        count = 0;
}
seconds = seconds - 0.0625; // is equal to 1/16th of a second; effectively takes off one second per second
if (seconds == 0) {
        [timer invalidate]; // cancels timer
        [timer release];
}

[self convertSeconds];

Это выделит объект только один раз.

0 голосов
/ 20 июля 2009

Вы можете инициализировать его в своем appDelegate и получить к нему доступ в любой момент времени. Не забудьте сдать его тоже.

Другим решением может быть создание из него синглтона

0 голосов
/ 20 июля 2009

Использование статической переменной

Вы можете использовать статическую переменную внутри метода, например

- (void)count {
    static SoundEffect *soundEffect =
        [[SoundEffect alloc] initWithContentsOfFile:
            [mainBundle pathForResource:@"beep" ofType:@"aif"]];
    ...
}

Здесь soundEffect будет инициализирован только один раз при первом вызове count и останется таковым до конца выполнения.

устарело: использование синглетонов

РЕДАКТИРОВАТЬ: Удален синглтон секции. Я не думаю, что это имеет отношение к вопросу.

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