Iphone 只分配一次常用类?
语言-Objective-C 我正在使用SoundEffect类来播放一个简短的声音。我正在使用NSTimer调用此方法: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
- (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实例变量在我看来比单例变量好。