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

标签 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 逻辑)。如果我错了,请纠正我。

最佳答案

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

您复制的数据最终位于当前堆栈框架的 sslContext 中,因此不需要您进行任何特殊管理即可使其消失。

简而言之,您不需要做任何事情,因为没有数据被复制到堆中。

关于ios - 内存管理。 CF 对象的字节副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21550777/

相关文章:

ios - 每次打开我的项目时,Xcode 都会意外退出

objective-c - 向 Mac 应用程序添加滚动的最简单方法

swift - cocoa 图形故障

macos - 是否有类似 Mac OS X 应用程序存储的数据库

ios - NSUserDefault 套件名称有限制吗?

iphone - 提醒 IOS 5 UITableView 外观和设计

ios - 在 Objective-C 中创建初始化器

iOS Toggles 不会在 View Controller 之间保留它们的状态

macos - 将Subversion 1.8工作副本降级到1.7

ios - 如何让 Google-Maps API 正常工作?