我已经使用Instruments来查找我的应用程序中的内存泄漏但我似乎无法解决它或找到解决方法;这是我的第一个应用程序,并首次涉足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.
}
任何帮助将不胜感激! 谢谢 马修
答案 0 :(得分:2)
仪器只会告诉您泄漏对象的创建位置。它无法告诉你哪里没有发布它(这就是泄漏的原因)因为它可能在任何地方。
很可能您将字符串分配给某个对象的某个属性,并且无法在该对象的-dealloc
中释放它。
答案 1 :(得分:0)
str
不是泄漏,或者至少它没有泄露在您发布的代码中。由于您使用+ stringWithUTF8String:创建字符串,因此您将获得一个自动释放的对象。返回该对象是安全的,调用者将能够使用它,但它最终会为您释放。如果调用者要保留对从-MakeMSG收到的字符串的引用,它应该保留它。