应用程序重新启动后存储Singleton阵列?

时间:2014-07-20 16:12:58

标签: ios objective-c arrays singleton

我需要在多个ViewControllers之间共享一个NSMutabaleArray,所以我创建了一个单例。但是,当我重新启动我的应用程序时,阵列似乎清除了自己,导致我的应用程序出现问题。这是我的单身人士:

·H

#import <Foundation/Foundation.h>

@interface playlistArray : NSObject {
    NSMutableArray *playlistSongsArray;
}

@property (nonatomic, retain) NSMutableArray *playlistSongsArray;

+ (id)sharedArray;

@end

的.m

#import "playlistArray.h"

@implementation playlistArray

@synthesize playlistSongsArray;

#pragma mark Singleton Methods

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

- (id)init {
    if (self = [super init]) {
        self.playlistSongsArray = [[NSMutableArray alloc] init];
    }

    return self;
}

- (void)dealloc {
    // Should never be called, but just here for clarity really.
}

@end

我考虑将其存储在NSUserDefaults中 - 这是正确的路线吗?如果是这样,我该怎么做?

非常感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:2)

从代码结构的角度来看,我不确定创建一个单独的单例类来将数组传递给不同的视图控制器是一个好主意。更简洁的方法是在创建可能需要它的视图控制器的新实例时直接传递playlistSongsArray

但是,如果您仍然希望在实现中出于某种原因使用单例,我会将playlistArray类更改为PlaylistManager类(请注意,常见的约定是将每个类的首字母大写类名中的单词) - 通过这样做,您不会限制自己使用仅限数组的实现,您可以使用它来在视图控制器之间共享其他播放列表信息。

至于应用程序启动之间的持续性,它实际上取决于您在阵列中存储的数据类型。例如,如果您的数组存储的NSUserDefaults s(或其他符合NSString的类)数量相对较少,则可以使用<NSCoding>。其他最常见的选项是NSKeyed​Archiver和核心数据。您可以通过Apple文档或NSHipster上的此类在线教程了解有关iOS上数据持久性的更多信息。

答案 1 :(得分:0)

  

我考虑将其存储在NSUserDefaults中 - 这是正确的路线吗?

NSUserDefaults肯定是你的选择。

您可以将以下两种方法添加到您的类中并在适当时调用它(例如,在单例初始化方法中使用savePlayList when you modify the array; loadPlaylist`):

- (void)savePlaylist {
   NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
   [defaults setObject:self.playlistSongsArray forKey:@"playlistSongs"];
   [defaults synchronize];
}

- (void)loadPlaylist {
   NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
   self.playlistSongsArray = [[defaults arrayForKey:@"playlistSongs"] mutableCopy];
}

请查看this post,了解您所采用的不同方法。

答案 2 :(得分:0)

重新启动应用程序时,您会将单例数组空白,因为已删除分配给该数组的所有内存。这些单例类在应用程序的生命周期中分配一次。

因此,每次打开应用程序时获取数据的最佳答案是将数据保存到磁盘中。要做到这一点,有几种方法

  1. 使用Sqlite的数据库
  2. 的plist
  3. NSUserDefaults的
  4. 如果要保存应用,可以使用userdefaults或plist。

    以下是将数组保存到userdefault

    的示例

    将数组保存到userdefaults:

    // Get the standardUserDefaults object, store your UITableView data array against a key, synchronize the defaults
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:array forKey:@"singletonArray"];
    [userDefaults synchronize];
    

    检索数组:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSArray *singletonArray = [userDefaults objectForKey:@"singletonArray"];
    

    希望它会对你有所帮助。快乐编码:)