2011-12-08 52 views
0

我有一個叫做Singleton的單身人士管理整個應用程序所需的某些變量。單身人士記憶體管理(多個班級)

我正在使用View Controller HomeViewController,它初始化viewDidLoad上的單例,然後向服務器發送消息並接收信息。然後,它會將這些信息與一個單獨的課程XMLParser解析。

XMLParser完成解析它發送一個通知給HomeViewController操作已完成,然後HomeViewController數據轉儲到NSLog

在我的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聲明是什麼樣的?他們是否保留傳遞給你的setter方法的值? –

+0

已更新。辛格爾頓位居榜首,其餘部分位於下方。 – Baub

回答

2

從另一個類發送[[MySingleton alloc] init]完全否定了單例的目的。您應該只能通過sharedSingleton類參考訪問單例。與實例是否已建立有關的所有邏輯都封裝在單例中。這樣你就可以確定你總是收到相同的實例。

在您的情況,您創建的Singleton一個新實例,完全繞開了共享實例所使用的HomeViewController,在XMLParser-init方法。

-parser:didEndElement:namespaceURI:qualifiedName:一種方法是設置上的Singleton一個全新的實例,而不是會話數據是通過sharedInstance類方法訪問的共享實例。一旦HomeViewController收到通知,它會檢查共享實例,並且屬性爲零,因爲正在填充錯誤的實例。從XMLParser刪除-init方法和singleton伊娃,並且僅使用[Singleton sharedInstance]來代替。

+0

哦,jeeze ......我現在正在拍我的頭!我不能相信我再次經歷過這個錯誤。我覺得自己像個白癡。 – Baub

1

什麼是代碼爲你單身?礦山總是看起來是這樣的:

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

而且,你是如何存儲你的數據?我看起來像這樣:

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

新增,請看上面。 – Baub