我在 SO 中看到了一个响应,指出如果一个对象不是 Objective-c 对象,它不受 ARC 内存管理的约束,因此必须由我在我的代码中释放。
因此,考虑到这一点,我如何确定一个对象(即 CFGregorianDate)是否是一个 Objective-c 对象,因此是否属于 ARC?某处有清单吗?(我看了看,找不到)。
我在 SO 中看到了一个响应,指出如果一个对象不是 Objective-c 对象,它不受 ARC 内存管理的约束,因此必须由我在我的代码中释放。
因此,考虑到这一点,我如何确定一个对象(即 CFGregorianDate)是否是一个 Objective-c 对象,因此是否属于 ARC?某处有清单吗?(我看了看,找不到)。
按住option
键并单击名称。如果它是 a class
,它定义了一个 Objective-C 对象。如果它是一个structure
它是一个C结构。
您可能需要也可能不需要释放 C 结构,具体取决于它是在堆栈中还是在堆中:
- (void)viewDidLoad
{
// This is a stack-base structure. It doesn't have to be freed.
CFGregorianDate mydate;
mydate.year = 2013;
mydate.month = 10;
mydate.day = 20;
mydate.hour = 11;
mydate.minute = 30;
mydate.second = 45;
// This is a heap-based structure. If must be freed.
CFGregorianDate *mydate2 = (CFGregorianDate *)malloc(sizeof(CFGregorianDate));
mydate2->year = 2013;
mydate2->month = 10;
...
free(mydate2);
回答后续问题:
Apple 的许多低级接口仍在 C 中。OpenGL 的东西、地址簿、核心图形。我最好的建议是在调用您以前从未使用过的函数时查看 Apple 的文档,特别是如果它正在为您创建像图像这样的大东西。请注意该接口是否是 C 接口(您可以轻松识别,因为参数一个接一个地传递,仅用逗号分隔)。Objective-C 接口的特点是括号([
和]
),参数都以关键字开头,结尾有冒号。Apple 的文档会告诉您是否有责任释放结构。
Objective-C 类由 @interface 块指定。如果以这种方式指定了一个类型,那么它就是一个 Objective-C 类。查看 CFGregorianDate 标头——它是否包含 Objective-C 类定义?不。
一般来说,一个框架要么使用 Objective-C 风格的对象,要么使用 CoreFoundation 风格的对象。CoreFoundation(CFGregorianDate 之家)显然使用后者。可可使用前者。
你能在上面调用方法吗?如果是这样,它是一个对象。它的接口都是 C 函数吗?不是一个对象。
(编辑)除了 dispatch_* 和 xpc_*,叹息。他们所做的诡计确实违反了一般规则