简体   繁体   English

iOS:无法识别的选择器已发送到实例

[英]iOS: Unrecognized selector sent to instance

I have a class where I request information from a provider class, in which after finalizing the job (asynchronous httpRequest block) needs to invoke a method [- (void) updateCountries] in the requester class. 我有一个我从提供程序类中请求信息的类,在该类中,完成作业(异步httpRequest块)后,需要在请求者类中调用方法[-(void)updateCountries]。 If I am not wrong this code worked in iOS 7, but now in iOS 8 it does not. 如果我没有记错的话,此代码可在iOS 7中使用,但现在在iOS 8中则无效。

Can you please help me to understand why? 你能帮我理解为什么吗?

Methods in requester class: 请求者类中的方法:

- (void) viewWillAppear:(BOOL)animated {
    //get countries to pickerView
    webAPI = [[WebAPI alloc] init];
    [webAPI retrieveCountries:self];
}

- (void) updateCountries {
    //update countries content for pickerView
    locationDAO = [[LocationDAO alloc] init];
    countriesArray = [locationDAO getCountries];

    [pickerView reloadAllComponents];
}

Lines in method in provider class where error happens: 提供程序类中方法中发生错误的行:

SEL updateCountries = sel_registerName("updateCountries:");
[requester performSelectorOnMainThread:updateCountries withObject:nil waitUntilDone:YES];

If you need to checkout the entire method in the provider class, here it is: 如果您需要在提供程序类中检出整个方法,则为:

- (void) retrieveCountries:(id)requester {

//    NSLog(@"engine report: firing retrieveCountries http get");

    NSString *urlAsString = kRetrieveCountriesListAPI;
    NSURL *url = [NSURL URLWithString:urlAsString];



    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
    [urlRequest setTimeoutInterval:30.0f];
    [urlRequest setHTTPMethod:@"GET"];
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-type"];


    [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        if ([data length] >0 && error == nil){
            NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"engine report: retrieveCountries server response: %@", response);

            NSArray *level0 = [[NSArray alloc] initWithObjects:[NSJSONSerialization JSONObjectWithData:[[NSData alloc] initWithData:data] options:kNilOptions error:&error], nil];

            NSArray *level1 = [level0 objectAtIndex:0];

            LocationDAO *locationDAO = [[LocationDAO alloc] init];
            [locationDAO deleteAllFromCountries];

            for (int i = 0; i < [level1 count]; i++) {

                CountryVO *countryVO = [[CountryVO alloc] init];

                countryVO.myID = [[[level1 objectAtIndex:i] objectForKey:@"id"] integerValue];
                countryVO.name = [[level1 objectAtIndex:i] objectForKey:@"country_name"];


                [locationDAO saveCountryToDatabase:countryVO];

            }

            SEL updateCountries = sel_registerName("updateCountries:");

            [requester performSelectorOnMainThread:updateCountries withObject:nil waitUntilDone:YES];

            dispatch_async(dispatch_get_main_queue(), ^(void){

            });


        } else if ([data length] == 0 && error == nil){
            NSLog(@"Nothing was downloaded.");

        } else if (error != nil) {
            NSLog(@"Error happened = %@", error);
        } }];

}

THANK YOU A WHOLE LOT 谢谢你

Remove the : from the selector specification: 卸下:从选择规范:

SEL updateCountries = sel_registerName("updateCountries");

Your method updateCountries doesn't take any arguments. 您的方法updateCountries不接受任何参数。 So, when creating the selector , you should only write updateCountries (instead of updateCountries: which would indicate that this method takes an argument). 因此,在创建选择器时 ,您只应编写updateCountries (而不是updateCountries:这表明该方法接受一个参数)。

The reason why your app crashes is that when you try to perform this selector, the internals of your app are looking for a method called updateCountries on requester that takes one argument. 您的应用程序崩溃的原因是,当您尝试执行此选择器时,您的应用程序内部会在requester程序上寻找一种名为updateCountries的方法,该方法接受一个参数。 This method doesn't exist, which is why the app crashes. 此方法不存在,这就是应用程序崩溃的原因。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM