Сбой при использовании executeSelector: с SEL, переданным из другого класса - PullRequest
0 голосов
/ 15 февраля 2012

Можно ли отправить селектор другому классу и заставить его работать с этим другим классом?

Это похоже на сбой с ошибкой *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[webManager _selector]: unrecognized selector sent to instance.Если это невозможно, что бы вы порекомендовали в качестве альтернативы?

Методы располагаются в порядке их выполнения.

//in HomeViewController
-(void)viewDidLoad
{
    WebManager *webManager = [[WebManager alloc] init];
    URLCreator *urlCreator = [[URLCreator alloc] initWithParam:@"default"];
    [webManager load:[urlCreator createURL] withSelector:@selector(testSelector)];
}
//in WebManager, which is also the delegate for the URL it loads when the load method is called...
-(void)load:(NSString*)url withSelector:(SEL)selector
{
    _selector = selector;    
    [self load:url];
}

-(void)load:(NSString*)url{
    NSURLRequest * request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection start];
}

//now the delegate response, ALSO in WebManager
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"Connection did finish loading. Parsing the JSON");

    [self getJSONDict:rawData]; //parses the data to a dictionary

    //perform the selector that is requested if there is one included
    if (_selector)
    {
        NSLog(@"Performing selector: %@", NSStringFromSelector(_selector));
        //the selector is called testSelector
        [self performSelector:@selector(_selector)];    
    }
}

- (void)testSelector //also in the WebManager class
{
    NSLog(@"Selector worked!");
}

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012
[self performSelector:@selector(_selector)];   

Код выше на самом деле переводится как [self _selector], который, как я предполагаю, не тот, который вы хотите. Вы должны изменить свой код на

[self performSelector:_selector];   
3 голосов
/ 15 февраля 2012

Это ваша проблема:

[self performSelector:@selector(_selector)];

A SEL - это тип, представляющий имя метода. @selector - это директива компилятора, которая преобразует буквенный текст внутри скобок в SEL.

Но _selector, ваш ивар, уже содержит a SEL. Вы конвертируете text"_selector" в SEL, а затем пытаетесь использовать это. Поскольку в целевом классе не существует метода с селектором _selector, вы получаете исключение.

Измените строку на:

[self performSelector:_selector];

и все должно быть денди. При этом используется SEL, который вы уже сохранили в переменной _selector.

Также, вообще говоря, отправьте свой реальный код изначально.

...