使用推文创建NSDictionary时“无法识别的选择器发送到实例”

时间:2012-05-25 19:03:57

标签: ios twitter unrecognized-selector

我正在使用此代码在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文本,但是当我尝试将它们添加到字典中以便最终将它们放入表中时,我会将“无法识别的选择器发送到实例”错误。

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

3 个答案:

答案 0 :(得分:2)

在此代码中:

 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是保留orpperty:

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

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

修改

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

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

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

答案 1 :(得分:1)

我曾经有过这个,它是释放视图控制器的应用程序,检查你的视图控制器是否正在被释放。

答案 2 :(得分:1)

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

这将返回推文的NSDictionary对象。可以通过查找密钥results中的内容来过滤掉该网址的Twitter搜索结果。

AKA:

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

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

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