objective-c - 我可以创建一个可通过不同方法访问的单个对象吗?

标签 objective-c cocoa nssound

这可能是一个基本问题,但总的来说,我对 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/

相关文章:

ios - 如何在另一个上下文中绘制pdf上下文?

swift - 计算 NSSound 循环的次数(Swift)

objective-c - 如何淡化 NSSound 对象

iphone - iOS:如何查询nsmutablearray对象中的对象

macos - Cocoa - 添加菜单以支持版本? (就像在文本编辑中一样)

iphone - UITableView reloadData 方法造成数据模糊的麻烦

objective-c - 为什么 'no known method for selector x'在ARC下是硬错误?

xcode - 声音选择器/macOS 上的系统声音列表

ios - 不同的初始 View Controller

java - 向 Java 程序员解释 Objective-C 委托(delegate)