[英]Singleton Memory Management (Multiple Classes)
我有一個稱為Singleton
的單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]);
}
從另一個類發送[[MySingleton alloc] init]
完全否定了單例的目的。 您應該只通過sharedSingleton
類引用訪問單例。 有關實例是否已建立的所有邏輯都封裝在單例內部。 這樣,您可以確保始終收到相同的實例。
在您的情況下,您已經創建了一個Singleton
的新實例,它完全繞過了XMLParser
的-init
方法中HomeViewController
使用的共享實例。
您的-parser:didEndElement:namespaceURI:qualifiedName:
方法將在新的Singleton
實例上設置會話數據,而不是通過sharedInstance
類方法訪問的共享實例上的會話數據。 HomeViewController
收到通知后,將檢查共享實例,並且屬性為nil,因為填充了錯誤的實例。 從XMLParser
刪除-init
方法和singleton
ivar,而僅使用[Singleton sharedInstance]
。
您的Singleton的代碼是什么? 我的總是看起來像這樣:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.