无法获取NSString的长度 - 无法识别的选择器发送到实例

时间:2010-08-09 18:35:44

标签: objective-c cocoa nsstring

我想要的是搜索Anime Titile的ID,比较长度并在之后执行某些操作。以下是调试器中的内容:

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 个答案:

答案 0 :(得分:3)

声明的返回类型RegExSearchTitleNSString *,但这并不强制返回的对象实际上是NSStringobj(来自JSON)的“id”元素是一个数字,因此返回NSNumber。编译器无法向您发出警告,因为它不知道将在集合中找到哪些类。

代码中还有其他错误。在return语句中的while语句中使用无条件for没有意义。

在旁注中,按照惯例,Objective-C方法名称以小写字母开头。

答案 1 :(得分:0)

嗯,这是因为您为NSNumber分配了AniID,而不是NSStringNSNumber没有length方法。

相关问题