我使用objective-c编写AES256Decrypt方法。
但是当我返回解密NSData时,内存不会释放,
我的代码如下:
- (NSData*)AES256DecryptWithKey:(NSString*)key andIv:(NSData*)iv{
char keyPtr[kCCKeySizeAES256 + 1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
iv.bytes /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess)
{
// ==============here==============
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted freeWhenDone:YES];
}
free(buffer); //free the buffer;
return nil;
}
我发现cryptStatus == kCCSuccess status,
返回[NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted freeWhenDone:YES];
代码不是免费的(缓冲区);
如果我将free(缓冲区)移动到
[NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted freeWhenDone:YES];
缓冲数据会很早发布。
如何降低内存成本以防止解密方法中的内存泄漏?
非常感谢你。答案 0 :(得分:0)
一种简单的方法是使用NSMutableData
作为缓冲区,传递可变字节并在解密后调整大小。
分配输出数据:
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length];
传递输出数据:
dataOut.mutableBytes, dataOut.length
设置解密数据长度:
dataOut.length = numBytesDecrypted;
返回解密数据:
return dataOut;
请参阅SO example