У меня есть синглтон с именем Singleton
, который управляет определенными переменными, необходимыми для меня в приложении.
Я использую View Controller HomeViewController
, который инициализирует синглтон на viewDidLoad
, а затем отправляет сообщение на сервер и получает информацию. Затем он берет эту информацию и анализирует ее с отдельным классом XMLParser
.
Когда синтаксический анализ XMLParser
завершен, он отправляет HomeViewController
уведомление о том, что это сделано, а затем HomeViewController
сбрасывает данные в NSLog
.
В моем классе XMLParser
я звоню [singleton setXX:XX]
, а затем NSLog(@"%@", [[singleton XX]description]);
, который отлично выводит данные. Если я вернусь к HomeViewController
(после уведомлений) и попытаюсь зарегистрировать те же самые данные, он вернет Null
.
Я пытался не инициализировать синглтон в viewDidLoad
и перемещать инициализацию до тех пор, пока не получу уведомление о том, что анализ завершен, но я все еще получаю Null
. Есть идеи? Я уверен, что это как-то связано с управлением памятью (ARC, кстати), но я точно не знаю, где именно.
Редактировать: Вот мой 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]);
}