3

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

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

4

3 回答 3

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 autoreleased 对象,因此它最终将被释放,并且您最终将获得指向已释放对象的指针。

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

就像是

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 方法。正如您在打印时评论显示的那样,它会打印字典。

于 2012-05-25T19:11:59.480 回答
1

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

于 2012-05-25T19:06:23.367 回答
1
[NSJSONSerialization JSONObjectWithData:responseData 
                                options:kNilOptions
                                  error:&jsonError];

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

又名:

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

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

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

于 2012-06-13T16:18:32.863 回答