Ошибка селектора NSDictionary NSString с пробелами - PullRequest
0 голосов
/ 26 августа 2011
-(void)messageSend:(NSString *)message;
{
NSLog(@"messageSend");
urlString = [[NSString alloc] initWithFormat:@"http://someaddress/message/send?from=%@&msg=%@&latitude=0&longitude=0",appDelegate.userName,message];
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithDictionary:[self request:urlString]];
NSLog(@"Dictionary response");
if ([dictionary count] > 0)
{
    if ([[dictionary objectForKey:@"send"] isEqualToString:@"OK"] )
    {
        NSLog(@"envio de mensagem de %@ Ok: %@",appDelegate.userName,message);
    }
}
[urlString release];
[dictionary release];
}

Выдает ошибку -[__NSArrayM getObjects:andKeys:]: unrecognized selector sent to instance.После некоторого тестирования с NSLogs строка

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithDictionary:[self request:urlString]];

является виновником, ведьма вызывает этот метод:

-(NSDictionary *)request:(NSString *)requestString
{
url =[[NSURL alloc] initWithString:requestString];
request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
error = [[NSError alloc] init];
responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
[responseData retain];
NSString *tempString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSMutableDictionary *tempDict= [[[NSMutableDictionary alloc] init] autorelease];
if (request)
{
    Parser *parser = [[Parser alloc] init];
    tempDict = [parser readXMLString:tempString];
    for (id key in tempDict)
    {
        NSLog(@"%@ is %@",key,[tempDict objectForKey:key]);
    }
}
[url release];
[error release];
[responseData release];
[tempString release];
return tempDict;
}

И это происходит, когда в строке сообщения есть пробелы.Но этого не было раньше.

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Я вижу несколько особенностей:

error = [[NSError alloc] init];
responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Обычно вы просто делаете:

NSError *error = nil;
responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Переменная ошибки будет заполнена адресом объекта ошибки, который автоматически высвобождается, если естьошибка, в противном случае она должна оставаться нулевой.Не выделяйте его самостоятельно, так как вы можете освободить не тот (который был возвращен методом sendSynchronousRequest: и т. Д.).Это может вызвать перевыпуск в конце вашего метода.

NSMutableDictionary *tempDict= [[[NSMutableDictionary alloc] init] autorelease];
if (request)
{
    Parser *parser = [[Parser alloc] init];
    tempDict = [parser readXMLString:tempString];
  • В блоке if вы перезаписываете указатель на tempDict вы только что создали.Это утечка памяти (но не причина вашей проблемы). Обновление : созданный вами файл выпущен автоматически.Нет утечки.

  • Вы также не release Parser, используемые в блоке if (и локально для него).

  • Вы никогда не проверяете значение ошибки, чтобы увидеть, действительно ли произошла ошибка.Как я уже сказал, вы должны установить error на nil перед вызовом sendSynchronousRequest:etc., а затем проверить, все еще ли оно nil, и если нет, отреагировать соответственно:

    if (error)
    {
        // error handling
    }
    

Какой тип возврата [parser readXMLString: tempString];?Может ли это быть массив, а не словарь?Например, массив словарей?

Добавить

NSLog(@"%@", tempDict);

в request: перед возвратом tempDict.Что это показывает?

getObjects:AndKeys:, вероятно, называется -[NSMutableDictionary initWithDictionary:].Очевидно, что real тип словаря, возвращаемого request:, не является словарем, это массив.Посмотрите, что я написал выше.

1 голос
/ 26 августа 2011

Виновником является линия tempDict = [parser readXMLString:tempString].Фактически это означает, что ваше предыдущее создание [[[NSMutableDictionary alloc] init] autorelease] не имеет смысла, так как оно будет просто перезаписано возвращаемым значением [parser readXMLString:tempString].В любом случае кажется, что метод -readXMLString: возвращает NSArray вместо NSDictionary.

...