2013-03-15 178 views
1

我有一個靜態字典已被初始化和數據已被添加到它在一個不同的.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

回答

2

當然,這是行不通的。

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

1

嘗試使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; 
} 
0

這些都是類方法,返回靜態對象。

你可能想要做這樣的事情:

NSDictionary *network_number = [Config getMccMncToLISCodeDictionary]; 
+0

我需要初始化mccMncToLISCodeDictionary第一個權利?我怎麼做?我必須使用'initLisDictionary'方法來做到這一點,但我在哪裏以及如何做,我嘗試的所有事情我都會遇到異常,應用程序終止 – nupac 2013-03-15 19:30:35