簡體   English   中英

單例內存管理(多個類)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM