我一直试图从我认为是我已经实施的单身人士课程中实施全球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
感谢您的投入。
答案 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]
-------------------------