Ios __NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters无法识别的选择器错误

Ios __NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters无法识别的选择器错误,ios,objective-c,Ios,Objective C,所以我是新来的,用Objective-c编程。我想用HTTP POST方法发出请求。我发送的参数类型为int 我得到了这个错误: [__NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters:]: unrecognized selector sent to instance 0xb0000000000048d3 在这一行代码中: return [string stringByAddingPercentEncodingWithA

所以我是新来的,用Objective-c编程。我想用HTTP POST方法发出请求。我发送的参数类型为int

我得到了这个错误:

[__NSCFNumber stringByAddingPercentEncodingWithAllowedCharacters:]: unrecognized selector sent to instance 0xb0000000000048d3
在这一行代码中:

return [string stringByAddingPercentEncodingWithAllowedCharacters:allowed];
整个代码:

 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
request.HTTPMethod = @"POST";
[request setHTTPBody:[self httpBodyForParameters:params]];

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (error) {
        NSLog(@"dataTaskWithRequest error: %@", error);
    }
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
        if (statusCode != 200) {
            NSLog(@"Expected responseCode == 200; received %ld", (long)statusCode);
        }}
    NSError *parseError;
    id responseObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
     if (!responseObject) {
        NSLog(@"JSON parse error: %@", parseError);
    } else {
    NSLog(@"responseObject = %@", responseObject);
     }
    NSLog(@"print123");

}];
[task resume];
}

- (NSData *)httpBodyForParameters:(NSDictionary *)parameters {
NSMutableArray *parameterArray = [NSMutableArray array];
    [parameters enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
NSString *param = [NSString stringWithFormat:@"%@=%@", [self percentEscapeString:key], [self percentEscapeString:obj]];
    [parameterArray addObject:param];
}];

NSString *string = [parameterArray componentsJoinedByString:@"&"];

    return [string dataUsingEncoding:NSUTF8StringEncoding];
}

- (NSString *)percentEscapeString:(NSString *)string {
NSCharacterSet *allowed = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"];
return [string stringByAddingPercentEncodingWithAllowedCharacters:allowed];
}

@Paulw11是正确的,错误是一个数字被当作字符串处理的结果。一个即时但有点笨拙的修复方法是,在枚举字典时,减少对所找到的值类型的承诺

// notice we change the type of obj id, not NSString*
[parameters enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
    // now, test for it's type and treat accordingly
    NSString *objString = ([obj isKindOfClass:[NSString self]])? [self percentEscapeString:obj] : [obj stringValue];
    NSString *param = [NSString stringWithFormat:@"%@=%@", [self percentEscapeString:key], objString];
    [parameterArray addObject:param];
}];
但这种脆弱的解决方案现在只适用于字符串和数字。如果您能说服服务器接受JSON,那么请求代码可以像这样简化和通用化

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
request.HTTPMethod = @"POST";

// params is your original (serializable) dictionary
NSError *error;
NSData *postData = [NSJSONSerialization dataWithJSONObject: params options:0 error:&error];
[request setHTTPBody:postData];

NSURLSessionTask *task =  // ...

参数字典中的一项是NSNumber,而不是NSString。@Dzi,很高兴听到这个消息。你可以把它标对来表示。你能帮我做点别的吗?我有一个错误,期望响应代码=200;收到500@Dzi,500表示服务器端出现内部错误。