Не удается получить длину строки NSString - нераспознанный селектор отправлен на экземпляр - PullRequest
0 голосов
/ 09 августа 2010

То, что я пытаюсь получить, - это поиск идентификатора Аниме-титиля, сравнение длины и выполнение некоторых действий после этого.Вот что я получаю в отладчике:

2010-08-09 14:30:48.818 MAL Updater OS X[37415:a0f] Detected : Amagami SS - 06
2010-08-09 14:30:48.821 MAL Updater OS X[37415:a0f] http://mal-api.com/anime/search?q=Amagami%20SS
2010-08-09 14:30:49.635 MAL Updater OS X[37415:a0f] 8676
2010-08-09 14:30:49.636 MAL Updater OS X[37415:a0f] -[NSCFNumber length]: unrecognized selector sent to instance 0x384aa40
2010-08-09 14:30:49.637 MAL Updater OS X[37415:a0f] -[NSCFNumber length]: unrecognized selector sent to instance 0x384aa40

Код, о котором идет речь:

    if ([self detectmedia] == 1) { // Detects Media from MPlayer via LSOF
        NSLog(@"Detected : %@ - %@", DetectedTitle, DetectedEpisode);

        NSString * AniID = [self searchanime]; // Perform a Search Operation and Returns the ID of the time from JSON
        NSLog(@"%@",AniID);
        if (AniID.length > 0) { // Compare the length of AniID to make sure it contains a ID
        // Other Action here
        }
//Release Detected Title and Episode
        [DetectedTitle release];
        [DetectedEpisode release];
    }

Метод SearchAnime:

-(NSString *)searchanime{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    //Escape Search Term
    NSString * searchterm = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                                NULL,
                                                                                (CFStringRef)DetectedTitle,
                                                                                NULL,
                                                                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                kCFStringEncodingUTF8 );

    //Set Search API
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://mal-api.com/anime/search?q=%@",searchterm]];
    NSLog(@"%@",[NSString stringWithFormat:@"http://mal-api.com/anime/search?q=%@",searchterm]);
    //Release searchterm
    [searchterm release];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    //Ignore Cookies
    [request setUseCookiePersistence:NO];
    //Set Token
    [request addRequestHeader:@"Authorization" value:[NSString stringWithFormat:@"Basic %@",[defaults objectForKey:@"Base64Token"]]];
    //Perform Search
    [request startSynchronous];
    // Get Status Code
    int statusCode = [request responseStatusCode];
            NSString *response = [request responseString];
    if (statusCode == 200 ) {
        return [self RegExSearchTitle:response]; // Returns ID as NSString
    }
    else {
        return @"";
    }

}

RegExSearchTitle

-(NSString *)RegExSearchTitle:(NSString *)ResponseData {
    OGRegularExpressionMatch    *match;
    OGRegularExpression    *regex;
    //Set Detected Anime Title
    regex = [OGRegularExpression regularExpressionWithString:DetectedTitle];
    NSEnumerator    *enumerator;
    // Initalize JSON parser
    SBJsonParser *parser = [[SBJsonParser alloc] init];
    NSArray *searchdata = [parser objectWithString:ResponseData error:nil];
    for (id obj in searchdata) {
        // Look in every RegEx Entry until the extact title is found.
        enumerator = [regex matchEnumeratorInString:[obj objectForKey:@"title"]];
        while ((match = [enumerator nextObject]) != nil) {
            // Return the AniID for the matched title
            return [obj objectForKey:@"id"];
        }
    }
    // Nothing Found, return nothing
    return @"";
}

Это необычное поведение, потому что я сравнивал длину NSString в прошлом, и она никогда не подводила меня.Мне интересно, в чем причина проблемы?

Ответы [ 2 ]

3 голосов
/ 09 августа 2010

Заявленный тип возврата RegExSearchTitle равен NSString *, но это не заставляет возвращаемый объект фактически быть NSString.Элемент "id" в obj (из JSON) является числом, поэтому возвращается NSNumber.Компилятор не может предупредить вас об этом, потому что он не знает, какие классы будут найдены в коллекции.

В коде есть другие ошибки.Наличие безусловного оператора return в операторе while в выражении for не имеет смысла.

Кстати, имена методов Objective C начинаются со строчной буквы.

0 голосов
/ 09 августа 2010

Ну, это потому, что вы присвоили NSNumber AniID, а не NSString. NSNumber не имеет length метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...