Q:

Add Data to a Singleton instance array

I have a class "DataStorage", in which i wish to use NSCoding protocols to save data.  However, when try to add to an array of that class, 
[DataStorage sharedData].firstNameArray addObject:firstName:];

When viewing the breakpoint in the DataStorage class it shows the array to be of "nil" value
Here's the class implementation...
#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

A:

First of all, the _firstNameArray should be a mutable array but the array you get from [decoder decodeObjectForKey:@"DataStorageFirstNameKey"]; is not mutable, so you must create one. 
Second, when you first use the instance, there is not file, so you will get nil in _fileNameArray, at this time, you should create a empty mutable array instead so you can add item in it. 
- (instancetype)initWithCoder:(NSCoder *)decoder
{
    self = [self init];
    if (self) {
        _firstNameArray = [[decoder decodeObjectForKey:@"DataStorageFirstNameKey"] mutableCopy];
        if (!_ firstNameArray) {
            _firstNameArray = [NSMutableArray array] ;
        }
    }
    return self;
}

So are the other properties.