Не удается устранить утечку памяти в приложении для iPad - PullRequest
0 голосов
/ 26 апреля 2011

Я использовал инструменты, чтобы обнаружить утечку памяти в моем приложении, но я просто не могу исправить это или найти обходной путь;это мое первое приложение и первый набег в Objective-C, так что я, вероятно, делаю что-то довольно глупое.Кто-нибудь может помочь?Я предполагаю, что объект NSString "str" ​​не освобождается, но как мне его освободить и затем вернуть?

Вот исходный код:

- (NSString *)MakeMsg:(uint8_t)slaveAddr FunctionCode:(uint8_t)functionCode StartReg: (uint16_t)startReg Range:(uint16_t)range {

NSString *str;

uint8_t CRCbyte1;
uint8_t CRCbyte2;
uint8_t buf[MODBUS_MSG_LEN_BYTES+LRC_BYTE+ASCII_WRAPPER];
uint8_t ASCIIbuf[(MODBUS_MSG_LEN_BYTES*2)+LRC_BYTE+ASCII_WRAPPER];  

buf[0] = slaveAddr;
buf[1] = functionCode;
buf[2] = (uint8_t)(startReg >> 8);
buf[3] = (uint8_t)(startReg & 0xFF);
buf[4] = (uint8_t)(range >> 8);
buf[5] = (uint8_t)(range & 0xFF);

if (RTUMode==YES){
    // calculate the CRC bytes 
    [self GenerateCRC16:buf CRC1:&CRCbyte1 CRC2:&CRCbyte2];
    buf[6] = CRCbyte1;
    buf[7] = CRCbyte2;
}

if (ASCIIMode==YES){
    // calculate the LRC byte
    [self GenerateLRC:buf Length:(uint8_t)MODBUS_MSG_LEN_BYTES ASCIIBuffer:ASCIIbuf];

    // convert the buffer to ASCII
    [self BufToASCII:buf ASCIIBuffer:ASCIIbuf];

    // add the ASCII wrapper ':',buf,'CR','LF'
    [self AddASCIIWrapper:buf ASCIIBuffer:ASCIIbuf];
}

str = [NSString stringWithUTF8String:(const char *)ASCIIbuf]; // <-- Memory leak identified as this line right here by Instruments
return str;// Return the string value of our command so we can use it in a comms log display.   

}

Любая помощь будет принята с благодарностью!Спасибо Мэтью

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Инструменты только сообщают вам, где был создан протекший объект.Он не может сказать вам, где вы не смогли его освободить (именно поэтому произошла утечка), потому что это может быть где угодно.

Скорее всего, вы присваиваете строку свойству объекта где-либо и не можете его освободить в-dealloc.

этого объекта
0 голосов
/ 26 апреля 2011

str не является утечкой или, по крайней мере, она не просочилась в код, который вы опубликовали. Так как вы создаете строку с помощью + stringWithUTF8String:, вы получаете автоматически выпущенный объект. Вернуть этот объект безопасно, и вызывающий абонент сможет его использовать, но в конечном итоге он будет выпущен для вас. Если вызывающая сторона собирается сохранить ссылку на строку, полученную от -MakeMSG, она должна сохранить ее.

...