2013-03-15 13 views
1

У меня есть статический словарь, который был инициализирован, и данные были добавлены в него в файле different.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) 

Предупреждения (желтая ошибка) я получаю" Несовместимый тип указателя, назначающий «Config * _strong» из NSDictionary * '»во второй строке кода в ViewController

Мой 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

+0

показать полные коды классов –

+0

полный код класса, как и во всем config.m? – nupac

ответ

2

Конечно, это не будет работать.

Config* network_number = [[Config alloc] init]; 
network_number = [Config getMccMncToLISCodeDictionary]; 
NSLog(@"network number:::%@", network_number); 

Этот код инициирует новый объект Config, однако при вызове network_number вы вызываете метод класса, поэтому его стоит ничего, что вы инициировали его раньше. Вы должны сделать это метод экземпляра (просто изменить + для - и убедитесь, что его объявили в заголовке), так что вы можете позвонить:

Config* network_number = [[Config alloc] init]; 
network_number = [network_number getMccMncToLISCodeDictionary]; 

ИЛИ вы должны сделать свой метод класса быть полностью самостоятельной достаточно, но я уверен, что это не то, что вы хотите.

EDIT:

+ (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; 
} 

Это ближе всего это может быть то, что вы, кажется, пытаются сделать.

Просто используйте эти 2 линии, игнорировать инициализации

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]; NSLog (@ "network number :::% @", network_number); 'но приложение перестает работать и генерирует исключение' uncaught exception 'NSInvalidArgumentException', reason: '+ [LISConfig initLISDictionary]: непризнанный селектор отправлен ' – nupac

+0

Вы не можете инициализировать класс. Сделайте экземпляр этого класса, а затем инициализируйте этот экземпляр, вы можете либо выполнить init, за которым следует initLISDictionary, либо объединить init с initLISDictionary. Вы получаете это исключение, потому что прямо сейчас у вас есть только метод экземпляра, а не метод класса. Но вы не можете сделать этот тип инициализации в методе класса. Сделать это очень просто. Проверьте мое редактирование. – Pochi

+0

Большое вам спасибо за ваш ответ, отлично работает – nupac

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

Смежные вопросы