【问题标题】:NSDictionary selector error NSString with spacesNSDictionary 选择器错误 NSString 带空格
【发布时间】:2011-08-25 23:25:47
【问题描述】:
-(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;
}

当消息的字符串有空格时会发生这种情况。 但以前没有发生过。

【问题讨论】:

  • readXMLString 总是返回字典吗?
  • 很明显,readXMLString 没有返回 NSDictionary。

标签: objective-c ios xcode nsstring nsdictionary


【解决方案1】:

我看到了一些特点:

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

通常,您只需这样做:

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

如果有错误,错误变量将填充自动释放的错误对象的地址,否则应保持为零。不要自己分配一个,因为您可能释放了错误的一个(sendSynchronousRequest:etc. 方法返回的那个)。这可能在你的方法结束时导致过度释放。

NSMutableDictionary *tempDict= [[[NSMutableDictionary alloc] init] autorelease];
if (request)
{
    Parser *parser = [[Parser alloc] init];
    tempDict = [parser readXMLString:tempString];
  • 在 if 块中,您将覆盖指向您刚刚创建的 tempDict 的指针。那是内存泄漏(但不是问题的原因)。 更新:您创建的更新是自动发布的。没有泄漏。

  • 你也不要release Parser 在 if 块中使用(并且是本地的)。

  • 您永远不会检查错误的值来查看是否确实发生了错误。正如我所说,您应该在调用sendSynchronousRequest:etc.之前将error设置为nil,然后检查它是否仍然是nil,如果不是,则做出相应的反应:

    if (error)
    {
        // error handling
    }
    

[parser readXMLString: tempString]; 的返回类型是什么?它可能是一个数组而不是字典吗?例如。字典数组?

添加一个

NSLog(@"%@", tempDict);

request: 中,在您返回tempDict 之前。它显示了什么?

getObjects:AndKeys: 可能在 -[NSMutableDictionary initWithDictionary:] 中调用。显然request: 返回的字典的real 类型不是字典,它是一个数组。看看我上面写的。

【讨论】:

  • @NSError:我似乎很担心初始化这样的对象,所以我不知道什么时候可以初始化你所说的方式,我会注意的。 @内存泄漏:我虽然是在创建字典,然后在上面放信息? @错误检查:如果我执行 NSLog("error: %@",error);我会打印错误吗? @readXMLString:: 它返回一个字典。我担心我可能让它返回一个可变的 =/ 就是这样,很抱歉我不能给你具体的信息,因为我现在不在家。
【解决方案2】:

罪魁祸首是tempDict = [parser readXMLString:tempString]。实际上,这意味着您之前创建的 [[[NSMutableDictionary alloc] init] autorelease] 毫无意义,因为它只会被 [parser readXMLString:tempString] 的返回值覆盖。无论如何,-readXMLString: 方法似乎返回的是 NSArray 而不是 NSDictionary

【讨论】:

  • 该行会造成泄漏,但泄漏不会导致崩溃。不确定(但很可能)这是否是问题的原因。我们不知道 Parser 做了什么,也不知道 readXMLString: 返回或应该返回什么(如果它返回 id 会怎样?)。据我所知,readXMLString: 可能是真正的罪魁祸首。
  • @Rudy:该行不会造成泄漏。对象是自动释放的。这只是草率和浪费。
  • 正确。自动释放从屏幕上掉下来,所以我错过了它,但滚动后我可以看到它。
  • 好吧,我不是在这里使用我的 mac,但我可以说我设计 readXMLString 以返回一个 NSDict,解析器获取一个 xml 字符串,将其分解并存储在 to-返回 NSDict。我会重新检查我的分配和释放,谢谢。顺便说一句,我将它设置为自动释放,因为我无法在明显返回之前释放它......还是我忘记了什么?
  • 其实并不是返回一个数组。但我声明了一个 NSDict 但初始化为一个 NSArray...问题解决了!
猜你喜欢
  • 1970-01-01
  • 2017-11-11
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多