仅分配一个常用课程一次?

时间:2009-07-20 14:28:46

标签: iphone macos

语言 - 目标-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 个答案:

答案 0 :(得分:4)

也许这个链接会有所帮助:Creating a Singleton Instance

答案 1 :(得分:3)

您可以将指向SoundEffect类的指针作为您自己类的成员。

答案 2 :(得分:1)

如果这只是你在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];

这只会分配一次对象。

答案 3 :(得分:0)

使用静态变量

您可以在方法中使用静态变量,如

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

此处soundEffect仅在count的第一次调用时初始化一次,并将一直保持到执行结束。

不推荐使用:使用单身人士

编辑:删除了单身部分。我不认为这与这个问题有关。

答案 4 :(得分:0)

您可以在appDelegate中初始化它,并在任何给定时间通过那里访问它。记得也要解除它。

另一个解决方案可能是制作单身