内存管理。 CF对象的字节副本

时间:2014-02-04 11:09:29

标签: ios objective-c macos memory-management memory-leaks

我遇到了一个有趣的问题。

我有这段代码(不要问为什么我需要做这样的事情):

CFDataRef data = ... get data from somewhere
SSLContextRef sslContext;
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContextRef)), (UInt8 *)&sslContext);

现在我不知道如何处理sslContext。据我所知,我已经制作了SSLContextRef的字节副本,我需要在使用它之后释放该内存。

所以这里有一个问题:我怎样才能正确释放记忆?

据我所知,我不能做CFRelease,因为当我得到(复制)对象时我没有增加引用计数,如果我只是尝试free(sslContext)我就崩溃了。

如果有人能解释它应该如何运作,我将不胜感激。

  

编辑:感谢用户 gaige 。他指出,在我复制的问题中,我只复制了对SSLContextRef的引用。据我所知,如果我这样做:

UInt8 *buffer = malloc(sizeof(SSLContext));
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContext)), buffer);

然后我可以毫无问题地做free(buffer);(前提是我没有做任何CFRetain / CFRelease逻辑)。如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您从sizeof(SSLContextRef)指向的CFDataRef复制了data个字节的数据,您没有增加任何引用计数,也没有复制除SSLContext以外的任何数据指向SSLContextRef结构的指针。 (struct SSLContext被声明为指向sslContext)的指针。

您复制的数据最终会出现在当前堆栈框架的{{1}}中,因此您不需要任何特殊的策展就可以让它消失。

简而言之,您不需要执行任何操作,因为堆中没有复制数据。