尝试将对象临时存储在Singleton类中的NSMutableArray中,以便以后在iOS中使用

时间:2014-02-03 01:14:22

标签: ios objective-c singleton

我有一个Singleton类有两个方法:

- (void)saveString:(NSString *)stringObject {

    [[[Singleton sharedInstance] stringArray] addObject:stringObject];
}

- (NSArray *)getArrayContents {

    return [[Singelton sharedInstance] stringArray];
}

以下是我的Singleton类的实现代码:

static Singleton *sharedSingleton = nil;

+ (Singleton *) sharedInstance {

    if (sharedSingleton == nil) {
        sharedSingleton = [[super alloc] init];
    }
    return sharedSingleton;
}

我的应用程序中有两个View Controllers(vcA和vcB)。我想要做的是暂时存储来自vcA的数据,以便stringArray中的数据可以在vcB之后访问。

以下是vcA用于存储数据的代码:

[[Singleton sharedInstance] saveString:stringName];

稍后在应用程序的生命周期中,vcB调用Singleton类从NSMutableArray中检索值:

NSArray *newArray = [[Singleton sharedInstance] getArrayContents];
       for (NSString *test in newArray) {
           NSLog(@"Here are the contents of the array %@", test);
       }

不幸的是,当我在vcB中调用打印数组的内容时,没有输出,因为数组是空的,尽管值已添加到数组中。我做错了什么?

3 个答案:

答案 0 :(得分:1)

试试这个,

创建Singleton

+(Singleton *)sharedSingleton {

    static dispatch_once_t once;
    static Singleton *sharedSingleton;
    dispatch_once(&once, ^{
        sharedSingleton = [[self alloc] init];
    });
    return sharedSingleton;
}

和单例类的init方法

- (id)init
{
    self = [super init];
    if (self) {
        //@property stringArray
        self.stringArray = [[NSMutableArray alloc] init];
    }
    return self;
}

Singleton

的其他方法
- (void)saveString:(NSString *)stringObject {

    [self.stringArray addObject:stringObject];
}

- (NSArray *)getArrayContents {

    return self.stringArray;
}

答案 1 :(得分:1)

我有这个问题。我在单身人士中的代码如下所示:

+ (ReportDataList*)sharedDataArray
{
    static dispatch_once_t pred;
    static ReportDataList *shared = nil;
    dispatch_once(&pred, ^{
        shared = [[ReportDataList alloc] init];
        self.rDetailsArray = [[NSMutableArray alloc] init];
    });
    return shared;
}

我错误地初始化了数组,因此当我在代码中创建对单例的引用时,它正在清空它。我删除了数组初始化,这是在 - (id)init方法中完成的,它工作正常。所以,我的代码看起来像这样:

+ (ReportDataList*)sharedDataArray
{
    static dispatch_once_t pred;
    static ReportDataList *shared = nil;
    dispatch_once(&pred, ^{
        shared = [[ReportDataList alloc] init];
    });
    return shared;
}

- (id)init
{
    self = [super init];
    if (self) {
        self.rDetailsArray = [[NSMutableArray alloc] init];
        [self initWithDummyValues];
    }else{
        NSLog(@"problem initialising array list");
    }
    return self;
}

答案 2 :(得分:0)

首先,这两种方法应该使用self,而不是sharedInstance:

- (void)saveString:(NSString *)stringObject {

    [[self stringArray] addObject:stringObject];
}

- (NSArray *)getArrayContents {

    return [self stringArray];
}

其次,当你已经拥有getArrayContents时,没有必要使用stringArray方法,并且get作为前缀通常保留用于将参数复制到的方法中,无论如何。

第三,我没有看到你在任何地方初始化stringArray,所以除非缺少代码,否则它是零并且它保持为零。也许试试:

+ (Singleton *) sharedInstance {

    if (!sharedSingleton) {
        sharedSingleton = [[self alloc] init];
        sharedSingleton.stringArray = [NSMutableArray new];
    }
    return sharedSingleton;
}

假设stringArray被声明为:

@property (readwrite, strong) NSMutableArray *stringArray;