0

我在 SO 中看到了一个响应,指出如果一个对象不是 Objective-c 对象,它不受 ARC 内存管理的约束,因此必须由我在我的代码中释放。

因此,考虑到这一点,我如何确定一个对象(即 CFGregorianDate)是否是一个 Objective-c 对象,因此是否属于 ARC?某处有清单吗?(我看了看,找不到)。

4

3 回答 3

2

按住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 的文档会告诉您是否有责任释放结构。

于 2013-04-28T00:14:51.970 回答
1

Objective-C 类由 @interface 块指定。如果以这种方式指定了一个类型,那么它就是一个 Objective-C 类。查看 CFGregorianDate 标头——它是否包含 Objective-C 类定义?不。

一般来说,一个框架要么使用 Objective-C 风格的对象,要么使用 CoreFoundation 风格的对象。CoreFoundation(CFGregorianDate 之家)显然使用后者。可可使用前者。

于 2013-04-28T02:45:26.987 回答
1

你能在上面调用方法吗?如果是这样,它是一个对象。它的接口都是 C 函数吗?不是一个对象。

(编辑)除了 dispatch_* 和 xpc_*,叹息。他们所做的诡计确实违反了一般规则

于 2013-04-27T23:49:49.270 回答