Ios 将数据添加到单实例数组

Ios 将数据添加到单实例数组,ios,objective-c,xcode,Ios,Objective C,Xcode,我有一个类“DataStorage”,我希望在其中使用NSCoding协议来保存数据。但是,当尝试添加到该类的数组时 [DataStorage sharedData].firstNameArray addObject:firstName:]; 在DataStorage类中查看断点时,它会将数组显示为“nil”值 下面是类的实现 #import "DataStorage.h" @implementation DataStorage @synthesize firstNameArray =

我有一个类“DataStorage”,我希望在其中使用NSCoding协议来保存数据。但是,当尝试添加到该类的数组时

[DataStorage sharedData].firstNameArray addObject:firstName:];
在DataStorage类中查看断点时,它会将数组显示为“nil”值

下面是类的实现

#import "DataStorage.h"


@implementation DataStorage

@synthesize firstNameArray = _firstNameArray;
@synthesize surnameArray = _surnameArray;
@synthesize companyArray = _companyArray;
@synthesize positionArray = _positionArray;
@synthesize emailArray = _emailArray;
@synthesize mobileArray = _mobileArray;
@synthesize productArray = _productArray;

+ (instancetype)sharedData {
    static id sharedInstance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [self loadInstance];
    });

    return sharedInstance;
}

- (instancetype)initWithCoder:(NSCoder *)decoder
{
    self = [self init];
    if (self) {
        _firstNameArray = [decoder decodeObjectForKey:@"DataStorageFirstNameKey"];
        _surnameArray = [decoder decodeObjectForKey:@"DataStorageSurnameKey"];
        _companyArray = [decoder decodeObjectForKey:@"DataStorageCompanyKey"];
        _positionArray = [decoder decodeObjectForKey:@"DataStoragePositionKey"];
        _emailArray = [decoder decodeObjectForKey:@"DataStorageEmailKey"];
        _mobileArray = [decoder decodeObjectForKey:@"DataStorageMobileKey"];
        _productArray = [decoder decodeObjectForKey:@"DataStorageProductKey"];

    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:_firstNameArray forKey:@"DataStorageFirstNameKey"];
    [encoder encodeObject:_surnameArray forKey:@"DataStorageSurnameKey"];
    [encoder encodeObject:_companyArray forKey:@"DataStorageCompanyKey"];
    [encoder encodeObject:_positionArray forKey:@"DataStoragePositionKey"];
    [encoder encodeObject:_emailArray forKey:@"DataStorageEmailKey"];
    [encoder encodeObject:_mobileArray forKey:@"DataStorageMobileKey"];
    [encoder encodeObject:_productArray forKey:@"DataStorageProductKey"];
}

+ (NSString*)filePath
{
    static NSString* filePath = nil;
    if (!filePath) {
        filePath =
        [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
         stringByAppendingPathComponent:@"datastorage"];
    }
    return filePath;
}

+ (instancetype)loadInstance
{
    NSData* decodedData = [NSData dataWithContentsOfFile: [DataStorage filePath]];
    if (decodedData) {
        DataStorage * dataStorage = [NSKeyedUnarchiver unarchiveObjectWithData:decodedData];
        return dataStorage;
    }

    return [[DataStorage alloc] init];
}

- (void)save
{
    NSData* encodedData = [NSKeyedArchiver archivedDataWithRootObject: self];
    [encodedData writeToFile:[DataStorage filePath] atomically:YES];
}


@end

首先,
\u firstNameArray
应该是一个可变数组,但是从
[decoder decodeObjectForKey:@“DataStorageFirstNameKey”获得的数组是不可变的,因此必须创建一个

第二,当您第一次使用实例时,没有文件,因此您将在
\u fileNameArray
中获得
nil
,此时,您应该创建一个空的可变数组,以便可以在其中添加项

- (instancetype)initWithCoder:(NSCoder *)decoder
{
    self = [self init];
    if (self) {
        _firstNameArray = [[decoder decodeObjectForKey:@"DataStorageFirstNameKey"] mutableCopy];
        if (!_firstNameArray) {
            _firstNameArray = [NSMutableArray array] ;
        }
    }
    return self;
}

其他属性也是如此。

如何实现
initWithCoder:
。我编辑以包含类实现如果
firstNameArray
为nil,并且您在其上调用
addObject:
,它仍然为nil。你需要先初始化它。我应该在哪里初始化它?在initwithcoder结束时?谢谢,我可以看到这是如何工作的。当它允许我的时候,我会接受它