之前,我学到了类,我有一个宣布为我在生成的NSManagedObject子类实体的方法:AVAudioPlayer不打无伊娃
// UserRecording.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import <AVFoundation/AVFoundation.h>
@interface UserRecording : NSManagedObject {
AVAudioPlayer *audioPlayer;
}
@property (nonatomic, retain) NSDate * dateCreated;
@property (nonatomic, retain) NSData * audioData;
@property (nonatomic, retain) NSString * name;
-(void) URplay;
@end
和这里的实现:
// UserRecording.m
#import "UserRecording.h"
@implementation UserRecording
@dynamic dateCreated;
@dynamic audioData;
@dynamic name;
-(void) URplay {
NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithData:self.audioData error:&error];
[audioPlayer play];
}
@end
当我了解了类别(通过斯坦福iTunes U视频),我将代码移到了一个类别中。但声音停止播放。唯一的区别是没有声明的实例变量(IVAR)。事实上,我在旧代码中测试过它。上面的代码播放音频,但是这个代码犯规(在模拟器):
// UserRecording.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface UserRecording : NSManagedObject
@property (nonatomic, retain) NSDate * dateCreated;
@property (nonatomic, retain) NSData * audioData;
@property (nonatomic, retain) NSString * name;
-(void) URplay;
@end
和实现:
// UserRecording.m
#import "UserRecording.h"
#import <AVFoundation/AVFoundation.h>
@implementation UserRecording
@dynamic dateCreated;
@dynamic audioData;
@dynamic name;
-(void) URplay {
NSError *error;
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData:self.audioData error:&error];
[audioPlayer play];
}
@end
也许有事情做与ARC?但无论如何,我能做什么?你不能在一个类别中声明一个实例变量,所以不能这样做。
谢谢,但正如我所提到的目标是把它放在一个类别。所以我不能使用财产&综合(没有IVARs)。而且我无法编辑实体文件,因为它会在某个时候重新生成,我会失去我的方法。原来我需要重新考虑这个设计,因为我需要持久的AVAudioPlayer(s)。 – 2012-07-12 18:42:43
对不起,你需要的只是AVAudioPlayer的引用,例如,我看到你的对象只是拥有属性和音频播放器。如何简单地从对象中移除音频播放器,在控制器中设置它,然后使用对象中的音频数据播放它。听起来更合理。 – 8vius 2012-07-12 18:52:08
这几乎是我所做的(见下文)。我只是测试它,它的工作原理。事实上,我摆脱了这个范畴。这是错误的设计 - 你不能“播放”录音,你只能“播放”AVAudioPlayer。 – 2012-07-12 19:32:15