2012-04-10 7 views
20

Was könnte dieser Fehler bedeuten?[__NSCFNumber length]: nicht erkannter Selektor an Instanz 0x6d21350 gesendet

[__NSCFNumber length]: unrecognized selector sent to instance 0x6d21350 

Hier ist mein Code:

NSString *urlString = @"http://api.twitter.com/1/statuses/update.json"; 
    NSURL *url = [NSURL URLWithString:urlString]; 

    NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; 
    [params setObject:status forKey:@"status"]; 
    [params setObject:replyToID forKey:@"in_reply_to_status_id"]; 
    [params setObject:@"1" forKey:@"include_entities"]; 

    // Build the request with our parameter 
    TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:params requestMethod:TWRequestMethodPOST]; 

    // Attach the account object to this request 
    [request setAccount:twitterAccount]; 

    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 
     if (!responseData) { 
      // inspect the contents of error 
      NSLog(@"%@", [error localizedDescription]); 

      self.alert = [[UIAlertView alloc] initWithTitle:@"HTTP error" message:@"I could not connect to the Twitter API." delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; 
      [self.alert show]; 

      [self.replyDelegate replyRequestSuccessful:NO]; 
     } 
     else { 
      /*NSString *responseDataAsString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
      NSLog(responseDataAsString);*/ 

      NSError *error; 
      NSArray *replyResponse = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error]; 

      if (!replyResponse) { 
       NSLog(@"%@", [error localizedDescription]); 

       self.alert = [[UIAlertView alloc] initWithTitle:@"JSON error" message:@"I could not parse the JSON response from the Twitter API." delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; 
       [self.alert show]; 

       [self.replyDelegate replyRequestSuccessful:NO]; 
      } 
      else { 
       [self.replyDelegate replyRequestSuccessful:YES]; 
      } 
     } 
    }]; 

Ich versuchte debuggin, und es stirbt, sobald sie die performRequestWithHandler eintritt. Es geht der Else-Block und stirbt mit dem obigen Fehler ab.

Antwort

67

Es bedeutet, dass Sie ein NSNumber, wo der genannte Code sind vorbei ein NSString oder ein anderes Objekt erwartet, die eine length Methode hat. Sie können Xcode anweisen, Ausnahmen zu unterbrechen, damit Sie sehen, wo genau die Methode length aufgerufen wird.

+7

Wahrscheinlicher ist, dass es ein Problem mit seiner Speicherverwaltung gibt, und die Laufzeitumgebung erwartet einen NSString, der nicht mehr vorhanden ist (vor vorzeitiger Aufhebung der Zuweisung), und stattdessen wurde dort eine NSNummer zugewiesen. Wenn Sie absichtlich versuchen, 'length' zu' NSNumber' zu senden, würde der Compiler Sie hoffentlich warnen. – dreamlax

+0

Nicht, wenn die 'NSNumber' in einem Wörterbuch oder über eine andere Schnittstelle übergeben wird, die die Typen löscht. Aber du hast recht, es ist ziemlich wahrscheinlich, dass er etwas zu viel freigibt. Es könnte eine gute Idee sein, mit 'NSZombieEnabled' zu versuchen. – zoul

+0

Was meinen Sie mit "löscht die Typen"? – dreamlax

6

Insbesondere diese Codezeile:

[params setObject:replyToID forKey:@"in_reply_to_status_id"]; 

die replyToID ist kein String oder eine Methode length. Wenn Sie dies nicht haben, oder wenn Sie das replyToID in einen String konvertieren, bevor Sie es in params einstellen, sollte es funktionieren.

Verwandte Themen