Инициализация NSDictionary в Objective C (для iOS) - PullRequest
0 голосов
/ 08 марта 2011

Я относительно новичок в Objective-C, и теперь у меня есть проблема в приложении для iPhone, которую я не до конца понимаю. Я пытаюсь использовать NSMutableDictionary, это, кажется, не работает, как я ожидаю по какой-то причине. Когда я запускаю отладчик и делаю po numberToCallerMap, чтобы увидеть словарь, я получаю исключение. Я прочитал документацию для NSMutableDictionary о том, как его инициализировать, но я не вижу, что я делаю неправильно. Помощь и советы приветствуются. Переменная, вызывающая у меня проблему, это numberToCallerMap, вот соответствующая функция:

- (void)setData:(NSString*)value{
[list release];
list = [[NSMutableArray alloc] init];
SBJSON *json = [[[SBJSON alloc] init] autorelease];
NSMutableDictionary* numberToCallerMap;
CallerInfo* caller;
NSDictionary* callerInfo;

@try {      
    NSArray *array = (NSArray*)[json objectWithString:value];       
    // reading all the items in the array one by one  
    numberToCallerMap = [NSMutableDictionary dictionary];

    for (id *item in array) {  

        // if the item is NSDictionary (in this case ... different json file will probably have a different class)  
        NSDictionary *dict2 = (NSDictionary *) item;  
        CallInfo *data = [CallInfo alloc];           
        [data initFromDictionary:dict2];


        callerInfo = (NSDictionary*)[dict2 valueForKey:@"caller"] ;

             //Here, we want the phonenumber to be part of the CallerInfo object instead.
             // It is sent from the server as part of the Call-object
        NSString* number = (NSString*)[dict2 valueForKey:@"phoneNumber"];
        [callerInfo setValue:number forKey:@"phoneNumber"];

        caller = (CallerInfo*)[numberToCallerMap valueForKey:number];
        if(caller == nil || [caller isKindOfClass:[NSNull class]]){
            caller = [CallerInfo alloc];
            [caller initFromDictionary:callerInfo];

            [numberToCallerMap setValue:caller forKey:number];  
            [list insertObject:caller atIndex:0];
            }
        [caller addRecentCall:data];            
     } 
}
@catch (NSException * e) {
    [list release];
    list = [[NSMutableArray alloc] init];
}
@finally {
    [numberToCallerMap release];
}
}

1 Ответ

1 голос
/ 08 марта 2011

Вероятно, это не единственная проблема, но вы не alloc - используете свой numberToCallerMap словарь, вы получаете его из метода вспомогательного класса - [NSMutableDictionary dictionary] - который возвращает его автоматически выпущенным. Так что не стоит звонить по этому номеру release.

...