2017-10-31 4 views
6

私は音楽を再生する必要があるゲームを作っています。私のコードをもっと扱いやすくするために、私は音を処理するNSObjectを作っていました(フェーディング、プレイリストのサウンドを再生するなど)。私はこのコードを持っている:NSObjectでNSSoundを再生する(Mac App with Objective-C)

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

このコードは、私がAppDelegate.mファイルに配置するときに動作しますが、私は新しいNSObjectのクラスに配置する場合は動作しません。

は(音楽命名)NSObjectのクラスのコード:

私はAppDelegate.mにこのコードでメソッドを呼び出す
- (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!"); 
} 

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

これが実行されると、それはログインしないが、「作品! "つまり、コードが実行されます。

したがって、全く同じコードはAppDelegateでは動作しますが、NSObjectクラスでは動作しません。 NSObjectクラスでNSSoundをプレイすることが可能かどうかは誰にも知られていますか(そうでない場合はどうしてですか?)、もしそうならコードを編集して動作させるのですか?それははるかに少ない乱雑に見える私のコードになるだろう;)

+2

あなたは、あなたがあなたの 'Music'のインスタンスを保持することを確認しています、それはにリリースされていないこと、すなわち、音楽の再生が始まる時間? –

+0

@ReinhardMänner私は実際には分かりません。私は保持と解放について多くのことを知らない。それがリリースされていないことをどうすれば確認できますか? – Developer

+0

コードを置く場所は重要ではないと思います。しかし、あなたがそれをどのコンテキストで実行しているかは重要です。 appdelegateでは、おそらくあなたのコードはメインのスレッドコンテキストで実行されます。したがって、このコードをブロックに入れてメインスレッドで実行して、違いがあるかどうかを確認する必要があります。 – manishg

答えて

1

をメインスレッドで呼び出されるメソッドを試してみて、

dispatch_async(dispatch_get_main_queue(), ^{ 
    // do work here 
}); 
関連する問題