phcaze
phcaze

Reputation: 1777

Get NSMutableDictionary from Singleton?

I created a singleton class in order to share an object inside my program. Here's the code:

SelectedRow.h

#import <Foundation/Foundation.h>
#import "TableEntry.h"

@interface SelectedRow : NSObject {
    TableEntry *rowValue;
}

@property (nonatomic, retain) TableEntry *rowValue;

+ (id)sharedManager;
- (void)setVariable:(TableEntry*)value;

@end

and SelectedRow.m

#import "SelectedRow.h"
#import "TableEntry.h"

@implementation SelectedRow

@synthesize rowValue;

+ (id)sharedManager {
    static SelectedRow *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}

- (id)init {
    if (self = [super init]) {
        rowValue = [[TableEntry alloc] init];
    }
    return self;
}

- (void)setVariable:(TableEntry*)value {
    rowValue = value;
}

@end

while TableEntry.h

#import <Foundation/Foundation.h>

@interface TableEntry : NSObject {
@private
    NSString *videoId;
    NSString *videoCategory;
    NSString *videoTitle;
    NSString *videoDescription;
    NSDate *videoDate;
    NSMutableArray *videoRelatedVideos;
    NSDictionary *videoAdditionalInformation;
    NSString *videoAccessControl;
    NSArray *videoFields;
    NSMutableDictionary *days;
    NSMutableDictionary *views;
    NSMutableDictionary *watchtime;
    NSMutableDictionary *subscribers;
    NSMutableDictionary *shares;
}

@property (copy) NSString *videoId;
@property (copy) NSString *videoCategory;
@property (copy) NSString *videoTitle;
@property (copy) NSString *videoDescription;
@property (copy) NSMutableArray *videoRelatedVideos;
@property (copy) NSDictionary *videoAdditionalInformation;
@property (copy) NSArray *videoFields;
@property (copy) NSString *videoAccessControl;
@property (copy) NSDate *videoDate;
@property (copy) NSMutableDictionary *days;
@property (copy) NSMutableDictionary *views;
@property (copy) NSMutableDictionary *subscribers;
@property (copy) NSMutableDictionary *shares;
@property (copy) NSMutableDictionary *watchtime;

- (id)setId:(NSString*)Id setCategory:(NSString*)Category setDate:(NSDate*)date setTitle:(NSString*)title setDescription:(NSString*)description setRelatedVideos:(NSMutableArray*)relatedVideos setAdditionalInformation:(NSDictionary*)additionalInformation setAccessControl:(NSString*)accessControl setFields:(NSArray*)fields setDays:(NSMutableDictionary*)days setViews:(NSMutableDictionary*)views setSubscribers:(NSMutableDictionary*)subscribers setShares:(NSMutableDictionary*)shares setWatchtime:(NSMutableDictionary*)watchtime;

- (NSString*)extractId;
- (NSString*)extractCategory;
- (NSString*)extractTitle;
- (NSString*)extractDescription;
- (NSMutableArray*)extractRelatedVideos;
- (NSDictionary*)extractAdditionalInformationVideos;
- (NSDictionary*)extractAccessControlVideos;
- (NSArray*)extractFields;
- (NSMutableDictionary*)extractDays;
- (NSMutableDictionary*)extractViews;
- (NSMutableDictionary*)extractSubscribers;
- (NSMutableDictionary*)extractShares;
- (NSMutableDictionary*)extractWatchtime;

@end

and TableEntry.m

- (id)init {

    self = [super init];
    if (self) {
        videoId = @"9bZkp7q19f0";
        videoCategory = @"Music";
        videoTitle = @"Demo Title";
        videoDescription = @"Demo description";
        videoDate = [NSDate date];
        videoAdditionalInformation = [NSDictionary alloc];
        videoRelatedVideos = [NSMutableArray alloc];
        videoAccessControl = @"demo accesControl";
        videoFields = [NSArray alloc];
        days = [NSMutableDictionary alloc];
        views = [NSMutableDictionary alloc];
        shares = [NSMutableDictionary alloc];
        subscribers = [NSMutableDictionary alloc];
        watchtime = [NSMutableDictionary alloc];
    }
    return self;
}

- (id)setId:(NSString*)Id setCategory:(NSString*)Category setDate:(NSDate*)date setTitle:(NSString*)title setDescription:(NSString*)description setRelatedVideos:(NSMutableArray*)relatedVideos setAdditionalInformation:(NSDictionary*)additionalInformation setAccessControl:(NSString*)accessControl setFields:(NSArray*)fields  setDays:(NSMutableDictionary*)Days setViews:(NSMutableDictionary*)Views setSubscribers:(NSMutableDictionary*)Subscribers setShares:(NSMutableDictionary*)Shares setWatchtime:(NSMutableDictionary*)Watchtime {
    videoId = Id;
    videoCategory = Category;
    videoDate = date;
    videoTitle = title;
    videoDescription = description;
    videoRelatedVideos = relatedVideos;
    videoAccessControl = accessControl;
    videoAdditionalInformation = additionalInformation;
    videoFields = fields;
    days = Days;
    views = Views;
    subscribers = Subscribers;
    watchtime = Watchtime;
    shares = Shares;

    return self;
}

- (NSString*)extractId {
    return self.videoId;
}

- (NSString*)extractCategory{
    return self.videoCategory;
}

- (NSString*)extractTitle{
    return self.videoTitle;
}

- (NSString*)extractDescription{
    return self.videoDescription;
}

- (NSMutableArray*)extractRelatedVideos{
    return self.videoRelatedVideos;
}

- (NSString*)extractAccessControlVideos{
    return self.videoAccessControl;
}

- (NSDictionary*)extractAdditionalInformationVideos{
    return self.videoAdditionalInformation;
}

- (NSArray*)extractFields{
    return self.videoFields;
}

- (NSMutableDictionary*)extractDays{
    return self.days;
}

- (NSMutableDictionary*)extractSubscribers{
    return self.subscribers;
}

- (NSMutableDictionary*)extractWatchtime{
    return self.watchtime;
}

- (NSMutableDictionary*)extractShares{
    return self.shares;
}

- (NSMutableDictionary*)extractViews{
    return self.views;
}

@end

I can extract any values from the singleton with:

SelectedRow *selectedRow = [SelectedRow sharedManager];
NSString *videoID = [selectedRow.rowValue extractId];

the problem arises with any NSMutableDictionary. If I try:

SelectedRow *selectedRow = [SelectedRow sharedManager];
NSMutableDictionary *days = [selectedRow.rowValue extractDays];

or with any other NSMutableDictionary I get this error:

[NSMutableDictionary count]: method sent to an uninitialized mutable dictionary object

what I'm I doing wrong? Thanks

Upvotes: 1

Views: 491

Answers (1)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726809

The [NSMutableDictionary alloc] call allocates the space for NSMutableDictionary, but it does not initialize it.

Replace it with [NSMutableDictionary dictionary] to fix the problem. Same goes for your NSArray and NSMutableArray objects (replace them with [NSMutable array] and [NSMutableArray array]).

The videoAdditionalInformation of type NSDictionary should be initialized to nil, though, because NSDictionary objects are immutable. If you are planning to set it to some dictionary later on, you might as well keep it nil on initialization.

In addition, you should reconsider the use of copy: it makes sense for NSString objects, but it hardly makes sense on NSMutableDictionary objects.

Upvotes: 5

Related Questions