2013-08-06 2 views
3

У меня есть следующий код, разработанный для преобразования объекта NSMutableString в NSData объекта:Как правильно освободить память в iOS: память никогда не выпускается; потенциальная утечка памяти, на которую указывает

-(NSData *)desSerializarFirma:(NSMutableString *)firma{ 

    NSArray *arregloBits = [firma componentsSeparatedByString:@","]; 
    unsigned c    = arregloBits.count; 
    uint8_t *bytes   = malloc(sizeof(*bytes) * c); 

    unsigned i; 
    for (i = 0; i < c; i ++) 
    { 
     NSString *str = [arregloBits objectAtIndex:i]; 
     int byte = [str intValue]; 
     bytes[i] = (uint8_t)byte; 
    } 

    return [NSData dataWithBytes:bytes length:c]; 
} 

, когда я анализирую это с Xcode он говорит

memory is never released; potential leak of memory pointed to by 'bytes' 

это заявление указывает на последняя строка моего кода:

return [NSData dataWithBytes:bytes length:c]; 

если я выпускаю объект, выполнив «свободных (байт)», то я получу FUNC бесполезно ... любая помощь, которую я буду признателен

+1

Вам просто нужно, чтобы освободить его, когда вы сделали с ним. –

+0

вы правы, с вашим ответом и помощью dasblinkenlight я могу решить это спасибо –

ответ

6

Необходимо, чтобы free байтов, потому что NSData не имеет права владеть им: он не может знать, является ли массив временной или динамической, поэтому он делает копию Это.

Чтобы устранить эту проблему, замените

return [NSData dataWithBytes:bytes length:c]; 

с

NSData *res = [NSData dataWithBytes:bytes length:c]; 
free(bytes); 
return res; 
+1

Эй, это сработало !!! спасибо за ответ, я разработал эту функцию таким образом, потому что все, что я хотел, - это уменьшить код до минимального выражения, возможно, это показывает, что меньше кода не всегда лучшее, спасибо !!! –

Смежные вопросы