2013-10-31 43 views
1

我對iOS開發相對比較陌生,但並不是新的(面向對象)編程。AVAudioPlayer在外包時不在玩

我編程是一種記錄程序的,我需要你的幫助,當談到這一點: 我試過外包AVAudioPlayer對象插入一個額外的類,AudioPlayer,這樣我就可以從不同的控制器訪問它。 除了播放任何聲音,我都應該做所有事情。 我的繼承人問題的簡化項目:

ViewController.m

- (IBAction)playButtonPressed:(id)sender 
{ 
    NSArray *pathComponents = [NSArray arrayWithObjects:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],@"AudioMemo.m4a",nil]; 
    NSURL *fileURL = [NSURL fileURLWithPathComponents:pathComponents]; 

    AudioPlayer *myPlayer = [[AudioPlayer alloc] init]; 
    [myPlayer myPlayAudio:fileURL]; 
} 

文件的其餘部分是空的/標準。

ViewController.h

#import <UIKit/UIKit.h> 
#import "AudioPlayer.h" 

@interface ViewController : UIViewController 

@property (strong, nonatomic) IBOutlet UIButton *playButton; 

- (IBAction)playButtonPressed:(id)sender; 

@end 

AudioPlayer.m

#import "AudioPlayer.h" 

@implementation AudioPlayer 

@synthesize aPlayer; 

-(id) myPlayAudio:(NSURL *)myURL 
{ 
    NSLog(@"in myPlayAudio; before play"); 

    NSError *err = nil; 

    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL]; 
    [audioSession setActive:YES error:&err]; 
    if(err) 
    { 
     NSLog(@"%@",err); 
    } 
    aPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:myURL error:&err]; 
    if(err) 
    { 
     NSLog(@"%@",err); 
    } 
    [aPlayer play]; 

    NSLog(@"in myPlayAudio; after play"); 

    //[audioSession setActive:NO error:&err]; 

    return err; 
} 

@end 

AudioPlayer.h

#import <Foundation/Foundation.h> 
#import <AVFoundation/AVFoundation.h> 

@interface AudioPlayer : NSObject <AVAudioPlayerDelegate> { 
    AVAudioPlayer *aPlayer; 
} 

@property (nonatomic, strong) AVAudioPlayer *aPlayer; 

-(id) myPlayAudio:(NSURL *) myURL; 

@end 

我已經添加AudioToolbox Framework,激活了的.plist文件iTunes的文件共享和裝載的AudioMemo.m4a文件到th e文件夾。

它顯示了兩個NSLogs(before + afterplay),但沒有發出任何噪音。我知道我沒有啓用iPhone的揚聲器,我想在這種情況下保持簡單。 當然,我查了一下音量,靜音模式等

當我做的一切地方(放在ViewController.m一切),就像在網上大部分的教程,它工作正常。

我搜索了一下,但之前沒有找到這個問題,所以如果有人能幫助我,我會非常感激。

回答

2

當我看到你正在使用ARC,所以這個對象:

AudioPlayer *myPlayer = [[AudioPlayer alloc] init]; 

釋放你分配它後不久。保持它在一個屬性而不是局部變量,它應該工作。

+0

謝謝,它的工作。我明白爲什麼當我聲明它是一個財產時,它會保留下來,但是你能告訴我爲什麼它在分配後很快就會被釋放(它們是我之前做的)。 –

+0

我建議閱讀關於內存管理的Apple參考資料: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html https://developer.apple .COM /庫/ MAC /閱讀發佈/的ObjectiveC/RN-TransitioningToARC /簡介/ Introduction.html – imihaly