不兼容的指针类型指定

问题描述:

我有一个静态字典已被初始化和数据已被添加到它在一个不同的.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]; 
} 
+2

此代码甚至没有任何意义。 – Sulthan 2013-03-15 17:59:14

+0

显示完整的课程代码 – 2013-03-15 18:33:00

+0

完整的课程代码与整个config.m中的一样? – nupac 2013-03-15 18:39:40

当然,这是行不通的。

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); 
+0

我实际上已将其更改为'NSDictionary * network_number = [Config getMccMncToLISCodeDictionary];'基于第一个答案,虽然我仍然得到一个null,我的新问题是我应该初始化mccMncLISCodeDictionary但我无法做到。我的新代码是什么'[Config initLISDictionary]; NSDictionary * network_number = [Config getMccMncToLISCodeDictionary];我的应用程序停止运行并抛出一个异常'未捕获的异常'NSInvalidArgumentException',原因:'+ [LISConfig initLISDictionary]:无法识别的选择器发送' – nupac 2013-03-15 19:16:12

+0

你不能初始化一个类。创建这个类的一个实例,然后初始化该实例,您可以执行一个init,后跟一个initLISDictionary,或者将init与initLISDictionary合并。你得到这个异常,因为现在你只有一个实例方法,而不是一个类方法。但是你不能在类方法中进行这种类型的初始化。让它变得非常简单。检查我的编辑。 – Pochi 2013-03-15 22:01:36

+0

非常感谢你的回答,完美地工作 – 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]; 
+0

我需要初始化mccMncToLISCodeDictionary第一个权利?我怎么做?我必须使用'initLisDictionary'方法来做到这一点,但我在哪里以及如何做,我尝试的所有事情我都会遇到异常,应用程序终止 – nupac 2013-03-15 19:30:35