如何使用NSKeyedUnarchiver解压缩BOOL属性?

时间:2014-03-31 15:27:23

标签: ios objective-c

我在应用程序中播放声音课 我实现了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吗?

感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:0)

您只能归档NSObject继承对象。即。的NSNumber

[NSKeyedArchiver archiveRootObject:@YES toFile:path]; //to save
_isSoundOn = [[NSKeyedUnarchiver unarchiveObjectWithFile:path] boolValue]; //to load