我在应用程序中播放声音课
我实现了on / off开关(在GUI上),用于禁用和启用声音播放。
我正在使用BOOL属性,这是有效的。
现在我正在尝试在文件中实现保存BOOL(声音打开/关闭),以便下次应用程序启动时状态自动恢复。
为此,我使用的是NSCoding协议,归档工作正常,但我在解压缩时遇到问题
我的应用程序无法启动它只会显示黑屏。
这是我的代码,只是我认为很重要的一部分。
GTN_Sound.h
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h> // for playing sound
@interface GTN_Sound : NSObject <NSCoding>
@property(nonatomic, readwrite, unsafe_unretained) BOOL isSoundOn;
+ (id)sharedManager;
- (void)playWinSound;
- (void)playLoseSound;
@end
GTN_Sound.m
#pragma mark - NSCoding Methods
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeBool:self.isSoundOn forKey:@"isSoundOn"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [GTN_Sound sharedManager];
if (self) {
_isSoundOn = [aDecoder decodeBoolForKey:@"isSoundOn"];
}
return self;
}
我认为代码到目前为止很好吗? 继续GTN_Sound.m
#pragma mark - itemArchivePath Method
- (NSString *)itemArchivePath
{
// Make sure that the first argument is NSDocumentDirectory
// and not NSDocumentationDirectory
NSArray *documentDirectories =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
// Get the one document directory from that list
NSString *documentDirectory = [documentDirectories firstObject];
return [documentDirectory stringByAppendingPathComponent:@"sound.archive"];
}
#pragma mark - custom seter Method
- (void)setIsSoundOn:(BOOL)theBoolean {
NSLog(@"My custom setter\n");
if(_isSoundOn != theBoolean){
_isSoundOn = theBoolean;
NSString *path = [self itemArchivePath];
[NSKeyedArchiver archiveRootObject:self toFile:path]; // this is doing save
}
}
每次更换GUI时,我都会节省成本 从我这看起来很好看,因为我不希望用户多次改变这种情况 现在,unarchiving来了,我认为这是一些问题。
#pragma mark - Singleton Methods
+ (id)sharedManager {
static GTN_Sound *sharedMyManager = nil;
// to be thread safe
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] initPrivate];
});
return sharedMyManager;
}
- (instancetype)init
{
@throw [NSException exceptionWithName:@"Singleton"
reason:@"Use +[GTN_Sound sharedManager]"
userInfo:nil];
return nil;
}
// Here is the real (secret) initializer
- (instancetype)initPrivate
{
self = [super init];
if (self) {
NSString *path = [self itemArchivePath]; // do as iVar, for futture
self = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
//_isSoundOn = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
}
return self;
}
我认为问题出在这一行
self = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
但不知道如何解决它。
我已经读过,当我进行存档时,我需要存档对象的所有属性 这也适用于私人ivars吗?
感谢任何帮助。
由于
答案 0 :(得分:0)
您只能归档NSObject继承对象。即。的NSNumber
[NSKeyedArchiver archiveRootObject:@YES toFile:path]; //to save
_isSoundOn = [[NSKeyedUnarchiver unarchiveObjectWithFile:path] boolValue]; //to load