【问题标题】:"unrecognized selector sent to instance" when creating NSDictionary with tweets使用推文创建 NSDictionary 时“将无法识别的选择器发送到实例”
【发布时间】:2012-06-14 00:18:32
【问题描述】:

我正在 Twitter 上搜索带有此代码的推文:

- (void)fetchTweets
{

NSURL *url = [NSURL URLWithString:@"http://search.twitter.com/search.json"];
NSDictionary *params = [NSDictionary dictionaryWithObject:@"#winning" forKey:@"q"];

TWRequest *request = [[TWRequest alloc] initWithURL:url 
                                         parameters:params 
                                      requestMethod:TWRequestMethodGET];

[request performRequestWithHandler:
 ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {

     if (responseData) {
         NSError *jsonError;
         tweets = 
         [NSJSONSerialization JSONObjectWithData:responseData 
                                         options:kNilOptions
                                           error:&jsonError];


         if (tweets) {
            // NSLog(@"%@", tweets);
         } 

         else { 
             NSLog(@"%@", jsonError);
         }

     }

     [[self delegate] receivedTweets];

 }];

[self performSelector:@selector(fetchTweets) withObject:nil afterDelay:30];

tweets 变量是一个 NSArray,我正在尝试使用以下代码将其放入 NSDictionary:

NSDictionary *tweet = [[TwitterHandler sharedInstance].tweets objectAtIndex:indexPath.row];

我确实得到了推文的 JSON 文本,但是当我尝试将它们添加到字典中以便最终将它们放入表中时,我得到了“无法识别的选择器发送到实例”错误。

我不确定我为什么会得到这个,任何帮助都将不胜感激。

【问题讨论】:

  • 你能添加实际的错误信息吗?它应该有选择器的名称和实例的类型。
  • @PhillipMills *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0xdec1140'
  • 要么你的 tweets 数组被释放,内存被重新用来保存字典,要么JSONObjectWithData 返回字典。当您取消注释 // NSLog(@"%@", tweets); 时,它说了什么?
  • 日志为我提供了我正在搜索的 JSON 格式的推文。
  • 但是它显示它们是在数组还是字典中???

标签: ios twitter unrecognized-selector


【解决方案1】:

在这段代码中:

 if (responseData) {
         NSError *jsonError;
         tweets = 
         [NSJSONSerialization JSONObjectWithData:responseData 
                                         options:kNilOptions
                                           error:&jsonError];


         if (tweets) {
            // NSLog(@"%@", tweets);
         } 

         else { 
             NSLog(@"%@", jsonError);
         }

tweets 是否与您使用此代码获得的相同:

[[TwitterHandler sharedInstance].tweets

如果是这样,在我看来,您将其分配给 au 自动释放对象,因此它最终会被释放,并且您最终会得到一个指向已释放对象的指针。

最好保留它或在分配时使用保留属性。

类似

tweets = 
         [[NSJSONSerialization JSONObjectWithData:responseData 
                                         options:kNilOptions
                                           error:&jsonError] retain];

或者,假设tweets 是一个retain orpperty:

self.tweets = 
         [NSJSONSerialization JSONObjectWithData:responseData 
                                         options:kNilOptions
                                           error:&jsonError];

不要忘记在不再需要它时释放它(至少在你班级的dealloc 中)

编辑

好的,事情就是这样,它与内存管理无关(最初的猜测是错误的!):我尝试了你的 URL,它返回:

{"error":"You must enter a query."}

这是一个 JSON 字典。然后 JSON Parser 将其识别为字典并返回一个字典。您可以将它存储在 NSArray* 中,但实例化的对象仍然是字典,并且只会响应 NSDictionary 方法。正如您在打印时评论显示的那样,它会打印字典。

【讨论】:

  • 我正在使用 ARC,所以我不能使用 retain 属性。我已经尝试过self.tweets,但仍然收到相同的错误消息。
  • 我对 ARC 不是很熟悉,除了基本知道它的作用外,有没有办法区分分配或保留对象的属性?因为要让 self.tweets 工作,属性 tweets 应该被声明为一个 retain 属性,代码类似于(在非 ARC 中):@property (nonatomic, retain) NSDictionary * tweets;
  • 我已将其声明为@property (strong, nonatomic) NSArray *tweets;
  • 我添加了一个编辑,解释了为什么您会收到一个字典,它不响应您尝试使用的 NSArray 调用。
  • 了解非常有帮助。我将尝试使用 NSDictionary 方法添加到我的表中。
【解决方案2】:

我有过一次,是应用程序释放视图控制器,检查你的视图控制器是否被释放。

【讨论】:

  • 我很确定它没有发布
  • 如果objectatindex为!= nil,只执行导致错误的代码,这样就不会出错
  • 这无济于事,因为它是对 objectAtIndex 的调用崩溃了。此外,在 Objective-C 中,调用 nil 对象上的方法并没有什么坏处。如果它必须返回某些东西,它将什么也不做并返回 nil/0。
【解决方案3】:
[NSJSONSerialization JSONObjectWithData:responseData 
                                options:kNilOptions
                                  error:&jsonError];

这将返回推文的 NSDictionary 对象。通过查找键 results 中的内容,可以过滤掉来自该 URL 的 Twitter 搜索结果。

又名:

NSDictionary *jsonTweet = [NSJSONSerialization JSONObjectWithData:responseData 
                                                          options:kNilOptions
                                                          error:&jsonError];

NSArray *tweet = [jsonTweet objectForKey:@"results"];

然后可以迭代推文,因为它们在 NSArray 中。

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2012-07-24
    相关资源
    最近更新 更多