Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 只分配一次常用类?_Iphone_Macos - Fatal编程技术网

Iphone 只分配一次常用类?

Iphone 只分配一次常用类?,iphone,macos,Iphone,Macos,语言-Objective-C 我正在使用SoundEffect类来播放一个简短的声音。我正在使用NSTimer调用此方法: - (void)count { count++; if (count == 16) { NSBundle *mainBundle = [NSBundle mainBundle]; SoundEffect *soundEffect = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathFo

语言-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类是低效的。当我按下一个按钮来启动计时器,并让它保持分配和初始化状态,这样我所要做的就是[音效播放]

谢谢

使用静态变量

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

- (void)count {
    static SoundEffect *soundEffect =
        [[SoundEffect alloc] initWithContentsOfFile:
            [mainBundle pathForResource:@"beep" ofType:@"aif"]];
    ...
}
这里,
soundEffect
将在第一次调用
count
时仅初始化一次,并将一直初始化到执行结束

不推荐使用:使用单例

编辑:删除单例部分。我认为这与问题无关。

使用静态变量

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

- (void)count {
    static SoundEffect *soundEffect =
        [[SoundEffect alloc] initWithContentsOfFile:
            [mainBundle pathForResource:@"beep" ofType:@"aif"]];
    ...
}
这里,
soundEffect
将在第一次调用
count
时仅初始化一次,并将一直初始化到执行结束

不推荐使用:使用单例


编辑:删除单例部分。我认为这与问题无关。

您可以将指向SoundEffect类的指针设置为您自己类的成员

您可以将指向SoundEffect类的指针设置为自己类的成员

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


另一个解决方案是将它做成一个单件,您可以在appDelegate中初始化它,并在任何给定的时间通过它访问它。记住也要解除锁定


另一个解决方案是将其作为一个单件

如果这是一个声音,您只能在
count
方法中使用,您可以使用一个静态变量来完成这个技巧(请注意,从技术上讲,这是一个内存泄漏,因为对象从未被释放)


这将只分配对象一次。

如果这是一个声音,您只能在
count
方法中使用,您可以使用一个静态变量来完成此操作(请注意,从技术上讲,这是一个内存泄漏,因为对象永远不会释放)


这将只分配一次对象。

我通常使用实例变量来保存我重用的数据。过多的单例响应应该被忽略。没有迹象表明你需要一个单例而不是一个实例变量,但是立即跳转到推荐一个单例显示了patternitis的模式。是的,你想在这里使用一个实例变量如果只有一个类想要播放声音,实例解决方案就可以了。但是,如果有多个类想要这样做,单例是一个很好的解决方案。我通常使用实例变量来保存我重用的数据。过多的单例响应应该被忽略。没有迹象表明你需要一个单例而不是一个实例变量,但是立即跳转到推荐一个单例显示了patternitis的模式。是的,你想在这里使用一个实例变量如果只有一个类想要播放声音,实例解决方案就可以了。然而,如果有多个类想要这样做,单例是一个很好的解决方案。或者他可以让soundEffect成为持有count方法的类中的一个实例变量。@Terry:+1我认为实例变量比单例更好。或者他可以让soundEffect成为持有count方法的类中的一个实例变量方法。@Terry:+1实例变量在我看来比单例变量好。