【发布时间】: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