如何在应用程序退出之前在内存中保留一个变量 [英] How to keep a variable in memory until the app quits

查看:135
本文介绍了如何在应用程序退出之前在内存中保留一个变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在iOS中有一个单例对象,它在实例化时解析一个CSV文件,然后保存结果。我想使这个对象可以普遍访问,并且我希望它不会在应用程序退出之前从内存中释放。我正在运行ARC,因此我无法进行手动保留。

I have a singleton object in iOS that when instantiated parses a CSV file and then holds the results. I would like to make this object universally accessible and I would like it to not be released from memory until the app quits. I am running ARC so I cannot do manual retains.

有没有一种方法可以做到这一点,以便它能与ARC一起工作?

Is there a way I can do this so it will work with ARC?

头文件:

Header File:

#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;

实施档案

Implementation File

#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


推荐答案

+(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;
}

来自任何地方:

From anywhere:

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

请注意,您的iOS应用已经有了一个您可以随时访问的单身人士:

Note that your iOS app already has a singleton that you can access anywhere:

AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

这篇关于如何在应用程序退出之前在内存中保留一个变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆