[__NSCFNumber length]: 无法识别的选择器发送到实例0x6d21350

20

这个错误可能意味着什么?

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

这是我的代码:

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

我尝试进行调试,但一旦进入performRequestWithHandler方法就停止了。它走到else代码块并出现上述错误。

2个回答

69

这意味着你正在将一个NSNumber传递给被调用的代码期望一个具有length方法的NSString或其他对象的位置。你可以告诉Xcode在异常时中断以便看到length方法被调用的确切位置。


8
很可能,他的内存管理存在问题,运行时/框架期望的NSString已经不在那里了(因为过早释放),而是由NSNumber分配代替。如果您有意尝试将“length”发送到“NSNumber”,编译器应该会发出警告。 - dreamlax
如果NSNumber是通过字典或其他擦除类型的接口传递的,则不会。但你说得对,他过度释放某些东西的可能性很大。尝试使用NSZombieEnabled可能是个好主意。 - zoul
“erases the types”是什么意思? - dreamlax
4
如果接口使用id而不是NSString,那么很容易在期望NSString的位置上放入NSNumber而不被编译器注意到。通常,“类型擦除”是指从事物中剥离显式类型的过程。在某些语言的集合中,这是一个普遍存在的问题:当您将某些内容放入Objective-C集合(如NSArray)中,然后再读取它时,编译器不再知道该事物的类型,因为它已经被擦除了。 - zoul

6

具体来说,这行代码:

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

replyToID 不是字符串或者没有 length 方法。如果你没有这个方法,或者在将 replyToID 转换为字符串后再将其设置为参数,则应该可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接