私は音楽を再生する必要があるゲームを作っています。私のコードをもっと扱いやすくするために、私は音を処理する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をプレイすることが可能かどうかは誰にも知られていますか(そうでない場合はどうしてですか?)、もしそうならコードを編集して動作させるのですか?それははるかに少ない乱雑に見える私のコードになるだろう;)
あなたは、あなたがあなたの 'Music'のインスタンスを保持することを確認しています、それはにリリースされていないこと、すなわち、音楽の再生が始まる時間? –
@ReinhardMänner私は実際には分かりません。私は保持と解放について多くのことを知らない。それがリリースされていないことをどうすれば確認できますか? – Developer
コードを置く場所は重要ではないと思います。しかし、あなたがそれをどのコンテキストで実行しているかは重要です。 appdelegateでは、おそらくあなたのコードはメインのスレッドコンテキストで実行されます。したがって、このコードをブロックに入れてメインスレッドで実行して、違いがあるかどうかを確認する必要があります。 – manishg