Objective-C定义全局数组以供多个ViewControllers使用

时间:2016-06-05 05:50:21

标签: ios objective-c arrays xcode

我一直试图从我认为是我已经实施的单身人士课程中实施全球NSMutableArray。

我可以输入ViewController#2,在数组中添加和删除对象。

然而,当我离开ViewController#2并返回时,数据不会持久存在,而且我有一个包含0个对象的数组。

你认为我做错了什么?

·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;
}

查看控制器#2

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

//Various add and remove code

感谢您的投入。

4 个答案:

答案 0 :(得分:3)

以下是在应用程序级别全局共享数据的最佳方法。单身人士课程是一把钥匙。 Singleton仅初始化一次,其余时间返回共享数据。

@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

以下是访问/使用共享数据的方法。

NSMutableArray * sharedData = [Singleton singleton].globalArray;

答案 1 :(得分:1)

使用以下代码在ViewController#2中创建单独的GlobalArray实例:

user session()

相反,您应该创建一个访问器方法来返回您的共享实例,如下所示:

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

实施:

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

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

然后从ViewController#2中调用它:

// GlobalArray.m

// ... your existing code

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

然而,使用全局变量在视图控制器之间传输数据是不好的做法;我建议你使用更安全的方法,例如创建一个委托。

答案 2 :(得分:0)

要创建一个共享的全局数组,如果这真的是你想要的,只需将它放在头文件中:

extern NSMutableArray *myGlobalArray;

并在您的主要源文件中:

NSMutableArray *myGlobalArray;

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

答案 3 :(得分:0)

使用此代码进行设置并获取数组视图,以便在控制器本身中单独添加和删除。

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


#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;
}
-------------------------
//get array
NSArray * array = [[GlobalArray sharedManager] getGlobalArray];

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