2011-12-08 8 views
0

Singletonという名前のシングルトンを持っています。シングルトンメモリ管理(複数クラス)

HomeViewController私はviewDidLoadでシングルトンを初期化し、メッセージをサーバーに送信して情報を受け取ります。その後、その情報を受け取り、別のクラスXMLParserで解析します。 XMLParserが、それはそれが行われていることHomeViewControllerに通知を送信し、その後NSLogにデータをダンプしますHomeViewController解析を終えている

私のXMLParserクラスでは、データを完全にダンプする[singleton setXX:XX]、次にNSLog(@"%@", [[singleton XX]description]);を呼び出します。 HomeViewController(通知の投稿の後)に戻って同じデータを記録しようとすると、Nullが返されます。

シングルトンをviewDidLoadに初期化せず、パーズが完了したという通知を受け取るまで初期化を移動しましたが、まだ私はNullを取得します。何か案は?私はそれがメモリ管理(ARC、btw)と関係があると確信していますが、私はどこで正確にわかりません。

編集:ここに私のSingletonコードです。

//.h 
//... 
@property (nonatomic, retain) NSArray *linkedList; 
@property (nonatomic, retain) NSDictionary *sessionData; 

+ (id)sharedSingleton; 

//.m 
static MySingleton *sharedSingleton = nil; 

@implementation MySingleton 

@synthesize linkedList, sessionData; 
+ (id)sharedSingleton { 
    @synchronized(self) { 
     if (sharedSingleton == nil) 
      sharedSingleton = [[self alloc] init]; 
    } 
    return sharedSingleton; 
} 

EDIT2:ここに私のシングルトンアクセサメソッドが

//XMLParser 
- (id) init { 
    self = [super init]; 
    if (self != nil) { 
     if (!singleton) singleton = [[MySingleton alloc]init]; 
    } 
    return self; 
} 
//...cut because no singleton access 
//Closing Element 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"SessionData"]) 
    { 
     NSLog(@"Completed with SessionData. ID:11116"); 
     [singleton setSessionData:sessionData]; 
     NSLog(@"SessionData Description: \n%@", [sessionData description]); 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"pushToScreen" object:nil]; 
     return; 
    } 
} 

//HomeViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    singleton = [MySingleton sharedSingleton]; 
} 
//...cut for useless code 
//Then when notification received, it calls this selector 
- (void)connect 
{ 
    //singleton = [MySingleton sharedSingleton]; 
    NSLog(@"%@", [[singleton linkedList]description]); 
} 
+0

XMLParserとHomeViewControllerの両方でシングルトンにどのようにアクセスしているかを確認する必要があります。コードの近似を入力しないでください。実際のコードをコピー&ペーストするだけです。 –

+0

あなたの@property宣言はどのように見えますか?彼らはあなたのセッターメソッドに渡された値を保持していますか? –

+0

更新されました。シングルトンは一番上にあり、残りはすべて下にあります。 – Baub

答えて

2

が完全にシングルトンの目的を否定:鉱山は、次のようになります。シングルトンは、sharedSingletonクラス参照を介してのみアクセスしてください。インスタンスが確立されているかどうかに関係するすべてのロジックは、シングルトン内にカプセル化されています。このようにして、常に同じインスタンスを返すことになります。あなたのケースでは

、あなたは完全にXMLParserさん-init方法では、HomeViewControllerで使用される共有インスタンスを迂回し、Singletonの新しいインスタンスを作成しました。

-parser:didEndElement:namespaceURI:qualifiedName:メソッドでは、Singletonの新しいインスタンスでセッションデータを設定していますが、sharedInstanceクラスメソッドでアクセスする共有インスタンスは設定していません。 HomeViewControllerが通知を受信すると、共有インスタンスがチェックされ、間違ったインスタンスが移入されているためプロパティがnilになります。 -initメソッドを削除し、singletonイールをXMLParserから削除し、代わりに[Singleton sharedInstance]を使用してください。

+0

ああ、ちょっと...私は頭の中で自分自身を打っている!私は再びそれを通過するとき、私はこれを逃したとは信じられません。私はそんなにばかな気分だ。 – Baub

1

など、あるあなたのシングルトンのコードは何ですか?私の場合、常に次のようになります。

BookDescriptorDataModel* BookDescriptorDataModel_instance; 
+(BookDescriptorDataModel*)getInstance 
{ 
    @synchronized(self) 
    { 
     if(!BookDescriptorDataModel_instance) 
     { 
      BookDescriptorDataModel_instance = [[BookDescriptorDataModel alloc] init]; 
      [BookDescriptorDataModel_instance load]; 
     } 
    } 
    return BookDescriptorDataModel_instance; 
} 

また、データをどのように保存していますか?別のクラスから[[MySingleton alloc] init]を送信

@property (strong,nonatomic) NSDictionary* bookDescriptor; 
+0

追加しました、上記をご覧ください。 – Baub

関連する問題