あなたのソリューションを実装した方法がより良くなり、なぜあなたの学習に役立つか分かります。
まず、Objective-C(少なくともCocoaとCocoa Touch)の慣例で、小文字で始まる変数とメソッド名を指定します。たとえば、 "Media"変数は "media"で、 "PlaySound"メソッドは "playSound"にする必要があります。
第2に、 "media"変数がグローバル変数として宣言されており、MyViewController.hファイルの@interface
にインスタンス変数として宣言する方がよいでしょう。したがって、MyViewController
の各インスタンスには、オブジェクト指向のカプセル化の概念に適した "media"というインスタンス変数があります。個人的には変数が "player"と呼ばれるのは、変数が何が良いかを記述するように思えるからです(私はここから "player"を使用します)。
第3に、あなたの "playSound"が常にあなたと同じ音を再生しようとしている場合、 "メディア"オブジェクトの割り当てを "init ..." initWithNibName:bundle:メソッド)。この方法で、オブジェクトを一度しかインスタンス化せず、 "playSound"メソッドが呼び出されるたびに呼び出されるわけではありません(私は複数回呼び出すことができます)。あなたは "playSound"メソッドは[player play]
を呼び出すだけです。このようにして、パスをインスタンス変数として持つ理由はありません。
最後に、上記のようにすれば、deallocメソッドで[player release]を呼び出すことは意味があります。deallocメソッドは、クラスのインスタンスの割り当てが解除され、そのクラスに属する「player」のインスタンスの割り当てが解除されたときに呼び出されます。
私の変更点は次のとおりです。 deallocメソッドで
MyViewController.h
#import <UIKit/UIKit.h>
@class AVAudioPlayer;
@interface MyViewController : UIViewController
{
AVAudioPlayer *player;
}
- (IBAction)playSound;
@end
MyViewController.m
#import <AVFoundation/AVAudioPlayer.h>
#import "MyViewController.h"
@implementation MyViewController
- (id)initWithNibName:(NSString*)nibName bundle:(NSBundle*)nibBundleOrNil
{
if (self = [super initWithNibName:nibName bundle:nibBundleOrNil]) {
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Sound" ofType:@"wav"];
player = [AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:NULL];
}
return self;
}
- (IBAction)playSound
{
[player play];
}
- (void)dealloc
{
[player release];
[super dealloc];
}
@end
あなたは[スーパーviewDidUnload] [スーパーのdealloc]を呼び出し、いないする必要があります。私はこれを気付かずに私の投稿を編集しました。 – yabada