在单例中初始化后数组为 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;
我有一个单例 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;