不兼容的指针类型指定
我有一个静态字典已被初始化和数据已被添加到它在一个不同的.m文件,现在在我的视图控制器我需要该静态字典。 字典实际上包含载体名称作为键和它们各自的数值作为值,所以我想要做的是检查手机属于哪个载体,然后获取相应的数字。 静态字典已经形成的.m文件是Config.m,它有一个实际返回静态字典的方法。不兼容的指针类型指定
+ (NSDictionary*) getMccMncToCodeDictionary
{
return mccMncLISDictionary;
}
我在我的ViewController所做的是: “不兼容的指针类型分配给
Config* network_number = [[Config alloc] init];
network_number = [Config getMccMncToLISCodeDictionary];
NSLog(@"network number:::%@", network_number);
在我的控制台它显示
network number:::(null)
警告(黄错误)我得到的是”不兼容的指针类型在ViewController的代码的第二行中分配给来自NSDictionary *'的'Config * _strong'
我initLISDictionary代码:
- (void) initLISDictionary
{
NSString* MCC = @"520";
NSString* CAT3G = [NSString stringWithFormat:@"%@00",MCC];
NSString* AIS = [NSString stringWithFormat:@"%@01",MCC];
NSString* CAT_CDMA =[NSString stringWithFormat:@"%@02",MCC];
NSString* TOT3G = [NSString stringWithFormat:@"%@15",MCC];
NSString* DTAC = [NSString stringWithFormat:@"%@18",MCC];
NSString* AIS_GSM_1800 = [NSString stringWithFormat:@"%@23",MCC];
NSString* TRUE_MOVE_H = [NSString stringWithFormat:@"%@88",MCC];
NSString* TRUE_MOVE = [NSString stringWithFormat:@"%@99",MCC];
mccMncLISCodeDictionary = [NSMutableDictionary dictionary];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:2] forKey:CAT3G];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:1] forKey:AIS];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:2] forKey:CAT_CDMA];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:4] forKey:TOT3G];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:3] forKey:DTAC];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:1] forKey:AIS_GSM_1800];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:5] forKey:TRUE_MOVE];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:5] forKey:TRUE_MOVE_H];
}
当然,这是行不通的。
Config* network_number = [[Config alloc] init];
network_number = [Config getMccMncToLISCodeDictionary];
NSLog(@"network number:::%@", network_number);
此代码启动一个新的配置对象,然而,当你调用你调用一个类方法的network_number,这样你才开始它的一文不值。你需要使它成为一个实例方法(只是改变+的 - 并确保其宣称的标头),使您可以拨打:
Config* network_number = [[Config alloc] init];
network_number = [network_number getMccMncToLISCodeDictionary];
不然你就必须让你的类方法是完全自我足够的,但我确定它不是你想要的。
编辑:
+ (NSDictionary*) getMccMncToCodeDictionary
{
NSString* MCC = @"520";
NSString* CAT3G = [NSString stringWithFormat:@"%@00",MCC];
NSString* AIS = [NSString stringWithFormat:@"%@01",MCC];
NSString* CAT_CDMA =[NSString stringWithFormat:@"%@02",MCC];
NSString* TOT3G = [NSString stringWithFormat:@"%@15",MCC];
NSString* DTAC = [NSString stringWithFormat:@"%@18",MCC];
NSString* AIS_GSM_1800 = [NSString stringWithFormat:@"%@23",MCC];
NSString* TRUE_MOVE_H = [NSString stringWithFormat:@"%@88",MCC];
NSString* TRUE_MOVE = [NSString stringWithFormat:@"%@99",MCC];
mccMncLISCodeDictionary = [NSMutableDictionary dictionary];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:2] forKey:CAT3G];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:1] forKey:AIS];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:2] forKey:CAT_CDMA];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:4] forKey:TOT3G];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:3] forKey:DTAC];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:1] forKey:AIS_GSM_1800];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:5] forKey:TRUE_MOVE];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:5] forKey:TRUE_MOVE_H];
return mccMncLISDictionary;
}
这是它可以给你仿佛是试图做最接近的一次。
只需使用这两条线,忽略初始化
NSMutableDictionary *network_number = [Config getMccMncToLISCodeDictionary];
NSLog(@"network number:::%@", network_number);
我实际上已将其更改为'NSDictionary * network_number = [Config getMccMncToLISCodeDictionary];'基于第一个答案,虽然我仍然得到一个null,我的新问题是我应该初始化mccMncLISCodeDictionary但我无法做到。我的新代码是什么'[Config initLISDictionary]; NSDictionary * network_number = [Config getMccMncToLISCodeDictionary];我的应用程序停止运行并抛出一个异常'未捕获的异常'NSInvalidArgumentException',原因:'+ [LISConfig initLISDictionary]:无法识别的选择器发送' – nupac 2013-03-15 19:16:12
你不能初始化一个类。创建这个类的一个实例,然后初始化该实例,您可以执行一个init,后跟一个initLISDictionary,或者将init与initLISDictionary合并。你得到这个异常,因为现在你只有一个实例方法,而不是一个类方法。但是你不能在类方法中进行这种类型的初始化。让它变得非常简单。检查我的编辑。 – Pochi 2013-03-15 22:01:36
非常感谢你的回答,完美地工作 – nupac 2013-03-16 04:37:22
尝试使initLISDictionary
方法的类的方法,然后你可以做到以下几点:
+ (NSDictionary*) getMccMncToCodeDictionary
{
if (mccMncLISDictionary == nil) {
[Config initLISDictionary];
}
return mccMncLISDictionary;
}
但是,你也初始化mccMncLISCodeDictionary
代替mccMncLISDictionary
,所以你需要把它解决掉。
你应该这样做:
NSDictionary *network_number = [Config getMccMncToLISCodeDictionary];
NSLog(@"network number:::%@", network_number);
因为你调用这个方法,它的返回类型是的NSDictionary
+ (NSDictionary*) getMccMncToCodeDictionary
{
return mccMncLISDictionary;
}
这些都是类方法,返回静态对象。
你可能想要做这样的事情:
NSDictionary *network_number = [Config getMccMncToLISCodeDictionary];
我需要初始化mccMncToLISCodeDictionary第一个权利?我怎么做?我必须使用'initLisDictionary'方法来做到这一点,但我在哪里以及如何做,我尝试的所有事情我都会遇到异常,应用程序终止 – nupac 2013-03-15 19:30:35
此代码甚至没有任何意义。 – Sulthan 2013-03-15 17:59:14
显示完整的课程代码 – 2013-03-15 18:33:00
完整的课程代码与整个config.m中的一样? – nupac 2013-03-15 18:39:40