在单例中初始化后数组为 nil class

Arrays are nil after initializing in singleton class

我有一个单例 class 并且我像这样初始化了 2 个数组。

- (id)init {
if (self = [super init]) {

        //----------------- request Array -------------------

    // obj 00
    listRequestArr=[[NSMutableArray alloc]init];
    NSMutableDictionary *tratype=[[NSMutableDictionary alloc]init];
    [tratype setValue: [NSNumber numberWithInt:-1] forKey:@"ride_type_id"];
    [tratype setValue: [NSNumber numberWithInt:0] forKey:@"request_id"];
    [listRequestArr addObject:tratype];

    // obj 01
    NSMutableDictionary *ridename=[[NSMutableDictionary alloc]init];
    [ridename setValue: @"" forKey:@"ride_name"];
    [listRequestArr addObject:ridename];

    // obj 02
    NSMutableDictionary *rideprice=[[NSMutableDictionary alloc]init];
    [rideprice setValue: @"" forKey:@"ride_price"];
    [rideprice setValue: @"-1" forKey:@"ride_cid"];
    [rideprice setValue: @"" forKey:@"ride_price_name"];
    [listRequestArr addObject:rideprice];

    // obj 03
    NSMutableDictionary *reqdesc=[[NSMutableDictionary alloc]init];
    [reqdesc setValue: @"" forKey:@"request_desc"];
    [listRequestArr addObject:reqdesc];

    // obj 04
    NSMutableDictionary *modesoft=[[NSMutableDictionary alloc]init];
    [modesoft setValue: @"" forKey:@"modes_str"];
    [listRequestArr addObject:modesoft];

    // obj 05
    NSMutableDictionary *origindes=[[NSMutableDictionary alloc]init];
    [origindes setValue: @"" forKey:@"origin_add"];
    [origindes setValue:nil forKey:@"origin_placemark"];
    [origindes setValue: @"" forKey:@"des_add"];
    [origindes setValue:nil forKey:@"des_placemark"];
    [listRequestArr addObject:origindes];

    // obj 06
    NSMutableDictionary *availability=[[NSMutableDictionary alloc]init];
    [availability setValue: @"" forKey:@"ret_or_one_way"];
    [availability setValue: @"" forKey:@"depdate1"];
    [availability setValue: @"" forKey:@"depdate2"];
    [availability setValue: @"" forKey:@"retdate1"];
    [availability setValue: @"" forKey:@"retdate2"];
    [listRequestArr addObject:availability];

    // obj 07
    NSMutableDictionary *passengers=[[NSMutableDictionary alloc]init];
    [passengers setValue: @"0" forKey:@"adult"];
    [passengers setValue: @"0" forKey:@"child"];
    [passengers setValue: @"0" forKey:@"infants"];
    [listRequestArr addObject:passengers];




    requestCompletion=[[NSMutableArray alloc]init];
    for (NSInteger i = 0; i < 10; i++)
        [requestCompletion addObject:[NSNumber numberWithInteger:0]];




     return self;


}

在我的 ViewController 之一中,我设置了

dm=[Datamanager sharedmanager];
dm.listRequestArr=nil;
dm.requestCompletionArr=nil;

这发生在我完成网络服务调用时。完成 Web 服务调用后如果我开始发出另一个请求,尽管我做了 dm=[Datamanager sharedmanager] 这两个数组仍然为零;似乎它没有初始化我在 Datamanager class 中所做的事情。这是什么原因?请帮我。 Firrt time it works but second it doesn't after I set them to nil.

谢谢

Singleton只在应用上线时分配一次。第一次调用后,它有 alloc,你再次将它设置为 nil。所以第二次:它仍然是零。很正常。你应该检查它 nil 并再次分配它。

两种可能的解决方案:

1) 你不需要单例,每个视图控制器都可以使用它自己的,因此只需设置一次。

2) 您想要 DESTROY 单例实例,因此为此公开一个方法 reinit() 或 clear()。

使用您的代码,可能的 'reset()' 方法是:

- (id)init {
if (self = [super init]) {
     [self reset];
     return self;
}

-(void) reset {
        //----------------- request Array -------------------

    // obj 00
    listRequestArr=[[NSMutableArray alloc]init];
    NSMutableDictionary *tratype=[[NSMutableDictionary alloc]init];
    [tratype setValue: [NSNumber numberWithInt:-1] forKey:@"ride_type_id"];
    [tratype setValue: [NSNumber numberWithInt:0] forKey:@"request_id"];
    [listRequestArr addObject:tratype];

    // obj 01
    NSMutableDictionary *ridename=[[NSMutableDictionary alloc]init];
    [ridename setValue: @"" forKey:@"ride_name"];
    [listRequestArr addObject:ridename];

    // obj 02
    NSMutableDictionary *rideprice=[[NSMutableDictionary alloc]init];
    [rideprice setValue: @"" forKey:@"ride_price"];
    [rideprice setValue: @"-1" forKey:@"ride_cid"];
    [rideprice setValue: @"" forKey:@"ride_price_name"];
    [listRequestArr addObject:rideprice];

    // obj 03
    NSMutableDictionary *reqdesc=[[NSMutableDictionary alloc]init];
    [reqdesc setValue: @"" forKey:@"request_desc"];
    [listRequestArr addObject:reqdesc];

    // obj 04
    NSMutableDictionary *modesoft=[[NSMutableDictionary alloc]init];
    [modesoft setValue: @"" forKey:@"modes_str"];
    [listRequestArr addObject:modesoft];

    // obj 05
    NSMutableDictionary *origindes=[[NSMutableDictionary alloc]init];
    [origindes setValue: @"" forKey:@"origin_add"];
    [origindes setValue:nil forKey:@"origin_placemark"];
    [origindes setValue: @"" forKey:@"des_add"];
    [origindes setValue:nil forKey:@"des_placemark"];
    [listRequestArr addObject:origindes];

    // obj 06
    NSMutableDictionary *availability=[[NSMutableDictionary alloc]init];
    [availability setValue: @"" forKey:@"ret_or_one_way"];
    [availability setValue: @"" forKey:@"depdate1"];
    [availability setValue: @"" forKey:@"depdate2"];
    [availability setValue: @"" forKey:@"retdate1"];
    [availability setValue: @"" forKey:@"retdate2"];
    [listRequestArr addObject:availability];

    // obj 07
    NSMutableDictionary *passengers=[[NSMutableDictionary alloc]init];
    [passengers setValue: @"0" forKey:@"adult"];
    [passengers setValue: @"0" forKey:@"child"];
    [passengers setValue: @"0" forKey:@"infants"];
    [listRequestArr addObject:passengers];




    requestCompletion=[[NSMutableArray alloc]init];
    for (NSInteger i = 0; i < 10; i++)
        [requestCompletion addObject:[NSNumber numberWithInteger:0]];
}

确保在头文件中添加 class

-(void) reset;