2012-05-25 1 views
3

Я в поисках Twitter для твитов с этим кодом:«непризнанный селектор послал к экземпляру» при создании NSDictionary с твитами

- (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]; 

Переменными твитами является NSArray, и я пытаюсь поставить его в NSDictionary с этот код:

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

Я определенно получаю текст JSON для твитов, но при попытке добавить их в словарь, чтобы я мог в конечном счете, поместить их в таблицу, я получаю «непризнанный селектор отправляется например» ошибка.

Я не уверен, почему я получаю это, и любая помощь будет оценена по достоинству.

+0

Можете вы добавить сообщение об ошибке? Он должен иметь имя селектора и тип экземпляра. –

+0

@PhillipMills '*** Завершение приложения из-за неперехваченного исключения« NSInvalidArgumentException », причина: '- [__ NSCFDictionary objectAtIndex:]: непризнанный селектор, отправленный экземпляру 0xdec1140'' –

+0

Либо ваш массив твитов освобождается, используемый для хранения словаря, или, может быть, 'JSONObjectWithData' ** возвратил ** словарь. Когда у вас '// NSLog (@"% @ ", твиты),' uncommented, что он сказал? –

ответ

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

Это возвращает объект NSDictionary для твитов. Результаты поиска в Twitter с этого URL-адреса можно отфильтровывать, ища содержимое в ключе results.

AKA:

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

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

Тогда твиты могут быть итерация, так как они находятся в NSArray.

1

У меня было это однажды, и это было приложение, освобождающее контроллер вида, проверьте, освобожден ли ваш контроллер вида.

+0

Я уверен, что он не выпущен. –

+0

выполняет только код, вызывающий ошибку, если objectatindex является '! = Nil', чтобы не было ошибки – virindh

+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 

Если это так, то мне кажется, что вы назначаете его аи autoreleased объект , поэтому он в конечном итоге будет выпущен, и вы получите указатель на выделенный объект.

Лучше сохранить его или использовать свойство сохранения при его назначении.

Что-то вроде

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

или, при условии, что tweets является сохранение orpperty:

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

Не забывайте, чтобы освободить его, когда он больше не нужен (по крайней мере, в dealloc из ваших класс)

EDIT

Ok, вот вещь, и это не имеет ничего общего с управлением памятью (неправильное начальное предположение!): Я попробовал ваш URL, и он возвращает:

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

Какой словарь JSon. Затем JSON Parser идентифицирует это как словарь и возвращает словарь. Вы можете сохранить его в NSArray *, но созданный объект все еще является словарем и будет отвечать только на методы NSDictionary. Как вы комментируете, когда вы печатаете его, он печатает словарь.

+0

Я использую ARC, поэтому я не могу использовать свойство сохранения. Я пробовал 'self.tweets', но я все равно получаю то же сообщение об ошибке. –

+0

Я не очень хорошо знаком с ARC, кроме как в основном зная, что он делает, но есть ли способ дифференцировать свойства, которые назначают или сохраняют объекты? Поскольку для работы self.tweets твиты свойств должны быть объявлены как свойство сохранения, код которого похож на (в не-ARC): @property (nonatomic, keep) NSDictionary * tweets; –

+0

Я объявила его как '@property (strong, nonatomic) NSArray * tweets;' –