这可能是一个基本问题,但总的来说,我对 Cocoa、Objective-C 和 OOP 都很陌生,而且我在任何地方都找不到这个问题的答案。
在我正在编写的应用程序中,我想在用户按下特定按钮时播放声音文件。我正在使用 NSSound 来实现它,并且实现它没有问题。问题是,我只知道如何通过每次按下按钮时创建一个新的 NSSound 对象来做到这一点:
- (IBAction)playSound:(id)sender {
NSSound *sound = [[NSSound alloc] initWithContentsOfFile:kSoundFilePath byReference:YES];
[sound play];
}
这对我来说是一个问题,因为如果用户在文件播放完毕之前重复单击该按钮,它将创建 NSSound 的新实例,并且它们都会相互播放,这是我不希望的。有没有一种方法可以让我在该方法之外创建 NSSound 对象,并使用按钮的 IBAction 方法检查 NSSound 是否正在播放,然后再告诉它再次播放?
最佳答案
是的,先生。这可以通过多种方式完成。一种简单的方法是使用私有(private)属性(property):
/* these are in the SAME FILE */
@interface MyClass ()
@property (nonatomic, retain) NSSound *sound;
@end
@implementation MyClass
- (IBAction)playSound:(id)sender {
self.sound = [[NSSound alloc] initWithContentsOfFile:kSoundFilePath byReference:YES];
[self.sound play];
}
@end
你也可以这样做。 编辑:正如 Avt 在评论中所述,以他的方式使用全局变量时存在一些问题。如果您曾经要创建此类的多个实例,那么最好使用 singleton design pattern 。为了解释一下,这里是 an article by the venerable Mattt Thompson .
@implementation MyClass
NSSound *sound;
...
- (IBAction)playSound:(id)sender {
sound = [[NSSound alloc] initWithContentsOfFile:kSoundFilePath byReference:YES];
[sound play];
}
@end
我个人使用第一种方法,因为从编程的角度来看,它更清楚地表明您的类拥有创建的对象。虽然第二种方式是合法的,但不太清楚对象所属的位置......它可能是方法范围内的局部变量,或者其他东西。我强烈推荐第一种方式,但为了教育的利益,你应该了解所有可能的方式。
关于objective-c - 我可以创建一个可通过不同方法访问的单个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868045/