Как сохранить переменную в памяти, пока приложение не закроется - PullRequest
3 голосов
/ 08 января 2012

У меня есть одноэлементный объект в iOS, который при создании экземпляра анализирует CSV-файл и затем сохраняет результаты. Я хотел бы сделать этот объект универсально доступным, и я бы хотел, чтобы он не был освобожден из памяти до тех пор, пока приложение не закроется. Я использую ARC, поэтому не могу выполнить ручное сохранение.

Есть ли способ, которым я могу сделать это, чтобы он работал с ARC?

Заголовочный файл:

#import <Foundation/Foundation.h>
#import "CHCSV.h"
#import "RCParserObject.h"


@interface ParserStore : NSObject <CHCSVParserDelegate>
{
    // CSV Variables
    RCParserObject *item;
    NSMutableArray *data;
    NSMutableArray *parsedData;
    int fields;
    bool open;
}

@property (atomic, retain) RCParserObject *item;
@property (atomic, retain) NSMutableArray *data;
@property (atomic, retain) NSMutableArray *parsedData;
@property (atomic) int fields;
@property (atomic) bool open;

+ (ParserStore *) defaultStore;

- (void) parseCSVFile:(NSString*)file;
- (void) categorizeData;

Файл реализации

#import "ParserStore.h"
#import "RCParserObject.h"
#import "RCDetailItem.h"

static ParserStore *defaultStore;

@implementation ParserStore

@synthesize item, data, parsedData, fields, open;

# pragma mark -
# pragma mark Singleton Methods

+ (ParserStore *) defaultStore
{
    if (!defaultStore) 
    {
        defaultStore = [[super allocWithZone:NULL] init];
    }
    return defaultStore;
}

+ (id) allocWithZone:(NSZone *)zone
{
    return [self defaultStore];
}

- (id) init
{
    NSLog(@"Running init on parser store");

    if (defaultStore) 
    {
        NSLog(@"Self data count is %d, right before return", self.parsedData.count);
        return defaultStore;
    }

    // NSLog(@"This better only happen once");
    self = [super init];
    [self setParsedData:[[NSMutableArray alloc] init]];
    [self parseCSVFile:@"ContentNoPathFileExt2ASCII"];
    [self categorizeData];
    // NSLog(@"Self data count is %d when first created", self.parsedData.count);

    return self;
}

    @property (atomic, retain) RCParserObject *item;
    @property (atomic, retain) NSMutableArray *data;
    @property (atomic, retain) NSMutableArray *parsedData;
    @property (atomic) int fields;
    @property (atomic) bool open;

    + (ParserStore *) defaultStore;

    - (void) parseCSVFile:(NSString*)file;
    - (void) categorizeData;

    @end

Ответы [ 2 ]

4 голосов
/ 08 января 2012
+(MySingleton *)singleton {
    static dispatch_once_t pred;
    static MySingleton *shared = nil;
    dispatch_once(&pred, ^{
        shared = [[MySingleton alloc] init];
        shared.someVar = someValue; // if you want to initialize an ivar
    });
    return shared;
}

Из любого места:

NSLog(@"%@",[MySingleton singleton].someVar);

Обратите внимание, что в вашем приложении для iOS уже есть синглтон, к которому можно получить доступ в любом месте:

AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
0 голосов
/ 08 января 2012

простой синглтон был бы чем-то вроде ... в .h:

@interface Foo : NSObject

+ (Foo *)sharedInstance;

@end

и в .m:

static Foo *_foo = nil;

@implementation Foo

+ (Foo *)sharedInstance {
  if (!_foo)
    _foo = [[Foo alloc] init];
  return _foo;
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...