NSMutableString добавить данные ошибки - PullRequest
0 голосов
/ 20 мая 2011


У меня есть AsyncSocket, как это.

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
NSString *message = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
[data getBytes:&tdata];
  if (tdata > 5) {

    if(bheader){
        if(!charS){
            if([message isEqualToString:@"S"]){
                CMSG = message;
                charS=YES;
            }
        }
        else{
            NSMutableString *tmp = [[NSMutableString alloc] initWithString:@""];
            [tmp appendString:CMSG];       <<<<< This is code error at loop 2, 
            [tmp appendString:message];     the first loop success but second is fail
            CMSG = tmp;
            [tmp release];
        }
    }
    else{  
        if (message){            
            cmessage = [[NSString alloc]initWithFormat:@"%@%@",cmessage,message]  ;
        }
        else
            NSLog(@"Error converting received data into UTF-8 String");

        cdata++;
        if(cdata==idata) {
            msgComplete=YES;
        }

    }

    if (msgComplete) {
        NSDictionary *userInfo = [NSDictionary dictionaryWithObject:cmessage forKey:kNotificationMessage];
        [notificationCenter postNotificationName:kNotification object:self userInfo:userInfo];
        cmessage=@"";
        CMSG=@"";
        msgComplete=NO;
        bheader=YES;
        cdata=0;
        charS=NO;
        [cmessage release];

    }
}

[sock readDataToLength:1 withTimeout:-1 tag:0];

}

Этот код не выполняется во втором цикле на [tmp appendString:CMSG]; Поток 1: Программа получила сигнал "SIGABRT"
Как исправить эту ошибку?
Спасибо гуру,

Ответы [ 2 ]

0 голосов
/ 20 мая 2011

Я вижу ошибку, которая может или не может быть основной проблемой здесь. В окончательном условном утверждении у вас есть:

cmessage=@"";
...
[cmessage release];

Я не думаю, что вы должны выпускать эту строку. На самом деле я не знаю всех входов и выходов NSString объектов, которые определены таким образом (в отличие от stringWithFormat: или initWithString:), но я не думаю, что вы владеете этим строковым объектом , Вы не должны были выпустить это.

Удалите это сообщение release и посмотрите, поможет ли оно.

0 голосов
/ 20 мая 2011

CMSG назначен на tmp, но сразу после этого запускается tmp.CMSG необходимо сохранять на протяжении всего цикла.

CMSG = tmp;   //<< should be CMSG = [tmp retain];
[tmp release];

Теперь у вас есть еще одна потенциальная проблема.Вы используете устаревший метод здесь

[data getBytes:&tdata];
  if (tdata > 5) {

getBytes: устарел из-за потенциального переполнения буфера, и результат getBytes не подходит для if(tdata > 5).Если вы хотите проверить длину байтов, получите ее из объекта NSData.

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