Iphone Objective-c子字符串范围异常

Iphone Objective-c子字符串范围异常,iphone,objective-c,ios,substring,fetch,Iphone,Objective C,Ios,Substring,Fetch,我正在创建一个imap客户端。我想解析传入数据的主体和标题,但它崩溃了。我不明白为什么它会崩溃,并给出子字符串超出范围的错误。我怎样才能修好它 我只想检查传入的字符串是否包含“FETCH”,所以我解析数据,因为字符串 *FETCH或*1 FETCH我认为检查(4,6)的IsequalString范围就足够了,但这不起作用 - (NSString*) readLine { NSMutableData* data = [[NSMutableData alloc] init]; uns

我正在创建一个imap客户端。我想解析传入数据的主体和标题,但它崩溃了。我不明白为什么它会崩溃,并给出子字符串超出范围的错误。我怎样才能修好它

我只想检查传入的字符串是否包含“FETCH”,所以我解析数据,因为字符串 *FETCH或*1 FETCH我认为检查(4,6)的IsequalString范围就足够了,但这不起作用

- (NSString*) readLine
{
    NSMutableData* data = [[NSMutableData alloc] init];
    unsigned char c;
    for (;;) {
        recv(socket_, &c, sizeof(c), 0);
        if (c == '\n') {
            NSString* s = [[NSString alloc] initWithData: data
                                                encoding: NSUTF8StringEncoding];
            NSString *str = [s substringWithRange:NSMakeRange(4, 6)];

            if( [str isEqualToString:@"FETCH "]){
            NSMutableArray *substrings = [NSMutableArray new];
                NSScanner *scanner = [NSScanner scannerWithString:s];
                [scanner scanUpToString:@"}" intoString:nil];
                while(![scanner isAtEnd]) {
                    NSString *substring = nil;
                    [scanner scanString:@"}" intoString:nil];
                    if([scanner scanUpToString:@"*" intoString:&substring]) {
                        // If the space immediately followed the }, this will be skipped
                        [substrings addObject:substring];
                    }
                    [scanner scanUpToString:@"}" intoString:nil]; // Scan all characters before next }
                }
                NSString *email;
                [emailList addObject:@"Select an Email"];
                for(int i=0; i<substrings.count;i++){
                    email = [substrings objectAtIndex:i];
                    [emailList addObject:email]; // add emails in emailList
                }
                [substrings release];
            }


            if (nil != s) {
                NSLog(@"%@",s);
            }



            [data release];
            return [s autorelease];
        } 
            else {
            [data appendBytes: &c length: 1];
        }
    }
    return nil;
}
-(NSString*)读线
{
NSMutableData*数据=[[NSMutableData alloc]init];
无符号字符c;
对于(;;){
recv(插座和c,尺寸为(c),0);
如果(c=='\n'){
NSString*s=[[NSString alloc]initWithData:data
编码:NSUTF8StringEncoding];
NSString*str=[s substringWithRange:NSMakeRange(4,6)];
if([str isEqualToString:@“FETCH”]){
NSMUTABLEARRY*子字符串=[NSMUTABLEARRY new];
NSScanner*scanner=[NSScanner scannerWithString:s];
[scanner scanuptString:@“}”intoString:nil];
而(![scanner isattend]){
NSString*子字符串=nil;
[扫描仪扫描字符串:@“}”intoString:nil];
if([scanner scanuptString:@“*”intoString:&子字符串]){
//如果空间紧跟在}之后,将跳过此操作
[子字符串添加对象:子字符串];
}
[scanner scanuptString:@“}”intoString:nil];//在下一步之前扫描所有字符}
}
NSString*电子邮件;
[emailList addObject:@“选择电子邮件”];

对于(int i=0;i而言,问题在于您的字符串可能短于7个字符,这意味着它没有6的索引

尝试类似以下内容:

NSRange range = [someString rangeOfString:@"FETCH "];
if( range.location != NSNotFound ) {
   //found it... so now do you processing...
}

您分配并初始化一个NSData对象,然后使用该空数据对象初始化一个字符串,使该字符串为空。

还有一个问题……填充数据可能会使它开始工作,但我也会改变您执行搜索的方式,因为您现在执行搜索的方式仍然可能失败。
NSRange range = [someString rangeOfString:@"FETCH "];
if( range.location != NSNotFound ) {
   //found it... so now do you processing...
}