3

iOSには、インスタンス化されたときにCSVファイルを解析して結果を保持するシングルトンオブジェクトがあります。私はこのオブジェクトを普遍的にアクセス可能にしたいと思いますし、アプリケーションが終了するまでメモリから解放されないようにしたいと思います。私はARCを実行しているので、手動による保持はできません。アプリケーションが終了するまで変数をメモリに保持する方法

私はこれを行うことができますので、それはARCで動作するのですか?

ヘッダーファイル:

@interface Foo : NSObject 

+ (Foo *)sharedInstance; 

@end 

との.mに:簡単なシングルトンは.hの中で...何かのようになります

#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 
+0

常にあるので、シングルトンは、ARCによって解放されるべきではない:あなたのiOSアプリは、すでにあなたがどこでもアクセスできるシングルトンを持っていることを

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

注意それへの参照。シングルトン.mでは、静的変数に格納されているシングルトンのインスタンスですか? –

+0

私はそれをしなかった、構文を教えてくれますか? –

+0

ああ、私はそれをやったことはありませんが、私はそれを無しにしました、それは正しいのですか? –

答えて

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

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

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

実装ファイル:

static Foo *_foo = nil; 

@implementation Foo 

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

@end 
どこからでも
+0

私は上記のコードでこれをやったと信じていて、うまく動作していないようです... –

+0

奇妙です。私はこの種のことを頻繁にやっていて、ARCでそれをリリースしても何の問題もありませんでした。 –

+0

基本的に、私はそこに変更可能な配列を持っており、時にはその配列の数がゼロになることは起こりません。 –

関連する問題