Ios 在singleton类中初始化后数组为零
我有一个单例类,我初始化了两个数组,如下所示Ios 在singleton类中初始化后数组为零,ios,objective-c,singleton,nsmutablearray,Ios,Objective C,Singleton,Nsmutablearray,我有一个单例类,我初始化了两个数组,如下所示 - (id)init { if (self = [super init]) { //----------------- request Array ------------------- // obj 00 listRequestArr=[[NSMutableArray alloc]init]; NSMutableDictionary *tratype=[[NSMutableDictionary alloc
- (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;
}
这发生在我完成webservice调用时。在完成web服务调用后,如果我开始发出另一个请求,尽管我执行了dm=[Datamanager sharedmanager],这两个数组仍然为零;似乎它没有初始化我在Datamanager
类中所做的操作。这是什么原因?请帮帮我。第一次有效,但第二次无效,我将它们设置为零
谢谢当应用程序上线时,Singleton只允许使用一次。在第一次调用后,将其设置为alloc,然后再次将其设置为nil。所以第二次:还是零。这很正常。你应该检查它为零,然后重新分配 两种可能的解决方案: 1) 您不需要单例,每个视图控制器都可以使用自己的设置,因此只需设置一次 2) 您希望销毁singleton实例,并为此目的公开一个方法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]];
}
设置
dm.listRequestArr=nil代码>,您想要什么?因为我想在完成某些操作后刷新我的表视图,所以我不清楚您的问题<代码>dm=[Datamanager sharedmanager];dm.listRequestArr=nil代码>因此listRequestArr
将为零。你有什么问题?我在关闭viewcontroller时将其设置为零。当我重新打开视图控制器时,我想像第一次一样重新初始化这两个数组为什么需要一个单例呢?为什么不直接使用Factory我怎么能破坏singleton实例?我想你用过dispatch_一次吧?(尽管代码未粘贴)。只需添加一个方法即可_sharedInstance=[[Datamanager alloc]init]您可以从init中取出代码并调用它setup方法,然后从init调用setup,但也可以公开setup,以便您可以在任何时候执行它。这很粗糙,但为了简单起见,请检查修改后的答案
- (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]];
}
-(void) reset;