M Jesse
M Jesse

Reputation: 2273

Objective-C Defining a Global Array for use by several ViewControllers

I've been trying to implement a global NSMutableArray from what I think to be a singleton class that I've implemented.

I can enter ViewController # 2, add and remove objects to the array.

However, when I leave ViewController #2 and come back, the data does not persist, and I have an array with 0 objects.

What do you think I'm doing wrong?

.h

//  GlobalArray.h
@interface GlobalArray : NSObject{
    NSMutableArray* globalArray;
}

+(void)initialize;

.m

#import "GlobalArray.h"

@implementation GlobalArray

static GlobalArray* sharedGlobalArray;

NSMutableArray* globalArray;

+(void)initialize{
    static BOOL initalized = NO;
    if(!initalized){
        initalized = YES;
        sharedGlobalArray = [[GlobalArray alloc] init];
    }
}

- (id)init{
    if (self = [super init]) {
        if (!globalArray) {
            globalArray = [[NSMutableArray alloc] init];
        }
    }
    return self;
}

View Controller #2

GlobalArray* myGlobalArray;
myGlobalArray = [[GlobalArray alloc] init];

//Various add and remove code

Thank you for your input.

Upvotes: 2

Views: 3108

Answers (4)

shankar karuppusamy
shankar karuppusamy

Reputation: 1

Use this code for set and get the array views, for adding and removing do it separate in controller itself.

//  GlobalArray.h
@interface GlobalArray : NSObject
@property (nonatomic, strong) NSMutableArray* globalArray;
+ (id)sharedManager;
-(NSMutableArray *) getGlobalArray;
-(void) setGlobalArray:(NSMutableArray *)array;
@end
 /*-----------------------------------------*/
#import "GlobalArray.h"

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

- (id)init{
    if (self = [super init]) {
        if (!globalArray) {
            globalArray = [[NSMutableArray alloc] init];
        }
    }
    return self;
}

-(NSMutableArray *) getGlobalArray{
   return self.globalArray;
}
-(void) setGlobalArray:(NSMutableArray *)array{
   _globalArray = globalArray;
}
@end

-------------------------
//get array
NSArray * array = [[GlobalArray sharedManager] getGlobalArray];

//set array
[[GlobalArray sharedManager] setGlobalArray:array]
-------------------------

Upvotes: 0

Aamir
Aamir

Reputation: 16987

Following is best approach to share data Globally at Application level. Singleton Class is a key. Singleton is only initialised once, rest of times shared data is returned.

@interface Singleton : NSObject
@property (nonatomic, retain) NSMutableArray * globalArray;
  +(Singleton*)singleton;
@end

@implementation Singleton
@synthesize globalArray;
+(Singleton *)singleton {
    static dispatch_once_t pred;
    static Singleton *shared = nil;
    dispatch_once(&pred, ^{
        shared = [[Singleton alloc] init];
        shared.globalArray = [[NSMutableArray alloc]init];
    });
    return shared;
}
@end

Following is the way to access/use shared data.

NSMutableArray * sharedData = [Singleton singleton].globalArray;

Upvotes: 3

Cemen
Cemen

Reputation: 975

You create separate instance of GlobalArray in your ViewController#2 with this code:

GlobalArray* myGlobalArray;
myGlobalArray = [[GlobalArray alloc] init];

Instead, you should create accessor method to return your shared instance, something like this:

//  GlobalArray.h
@interface GlobalArray : NSObject{
    NSMutableArray* globalArray;
}

+(void)initialize;
+(GlobalArray*)sharedInstance;

with implementation:

// GlobalArray.m

// ... your existing code

// accessor method
+(GlobalArray*)sharedInstance
{
    return sharedGlobalArray;
}

and then call it from your ViewController#2:

GlobalArray* myGlobalArray = [GlobalArray sharedInstance];

However, using global variables to transfer data between view controllers is bad practice; I suggest you to use more safe methods, create a delegate, for example.

Upvotes: 1

EricS
EricS

Reputation: 9768

To create a shared global array, if that's really what you want, just put this in the header file:

extern NSMutableArray *myGlobalArray;

and this in your main source file:

NSMutableArray *myGlobalArray;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   myGlobalArray = [NSMutableArray new];
}

Upvotes: 0

Related Questions