如何在缓冲区

时间:2017-03-07 13:49:13

标签: ios objective-c memory

我使用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];

缓冲数据会很早发布。

如何降低内存成本以防止解密方法中的内存泄漏?

非常感谢你。

1 个答案:

答案 0 :(得分:0)

一种简单的方法是使用NSMutableData作为缓冲区,传递可变字节并在解密后调整大小。

分配输出数据:

NSMutableData  *dataOut = [NSMutableData dataWithLength:dataIn.length];

传递输出数据:

dataOut.mutableBytes, dataOut.length

设置解密数据长度:

dataOut.length = numBytesDecrypted;

返回解密数据:

return dataOut;

请参阅SO example