【问题标题】:Playing NSSound in NSObject (Mac App with Objective-C)在 NSObject 中播放 NSSound(使用 Objective-C 的 Mac App)
【发布时间】:2017-10-31 12:33:17
【问题描述】:

我正在制作一款需要播放音乐的游戏。为了使我的代码更易于管理,我想制作一个 NSObject 来处理声音(如淡入淡出、在播放列表中播放声音等)。我有这个代码:

NSSound *music = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.filename ofType:self.fileExtention] byReference:NO];
[music play];

此代码在我将其放在 AppDelegate.m 文件中时有效,但在我将其放入新 NSObject 类时无效。

NSObject 类中的代码(命名为 Music):

- (void)playMusic:(NSString *)fileName ofType:(NSString *)type
{
    NSSound *music = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.filename ofType:self.fileExtention] byReference:NO];
    [music play];

    NSLog(@"Works!");
}

我在 AppDelegate.m 中使用此代码调用方法:

[[[Music alloc] init] playMusic:self.fileName ofType:self.extension];

执行此操作时,它会记录“工作!”这意味着代码被执行。

所以完全相同的代码在 AppDelegate 中有效,但在 NSObject 类中无效。有谁知道是否可以在 NSObject 类中播放 NSSound(如果没有,为什么?),如果可以,如何编辑代码以使其正常工作?它会让我的代码看起来不那么凌乱;)

【问题讨论】:

  • 您确定保留您的Music 实例,即在开始播放音乐时它尚未发布吗?
  • @ReinhardMänner 实际上我不知道。我真的不太了解保留和释放。如何确保它没有被发布?
  • 我认为将代码放在哪里并不重要;但是,在哪种情况下运行它可能很重要。在 appdelegate 中时,您的代码可能在主线程上下文中运行。所以也许你应该把这段代码放在一个块中并在主线程中运行它,看看它是否有什么不同。
  • 您确定该文件存在吗?即使您不使用 ARC,它也应该可以工作,所以我认为这不是问题...

标签: objective-c cocoa nsobject nssound


【解决方案1】:

尝试在主线程上调用方法,

dispatch_async(dispatch_get_main_queue(), ^{
  // do work here
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多