【问题标题】:How do I know if an object is a Objective-c object and therefore is handled by ARC?我如何知道一个对象是否是 Objective-c 对象并因此由 ARC 处理?
【发布时间】:2013-04-27 23:43:05
【问题描述】:

我在 S.O. 中看到了回复。这表明如果一个对象不是 Objective-c 对象,它不受 ARC 内存管理的约束,因此必须由我在我的代码中释放。

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

【问题讨论】:

  • 一个Objective-C对象可以用id来表示。

标签: ios objective-c automatic-ref-counting


【解决方案1】:

按住option 键并单击名称。如果是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 的文档会告诉您是否有责任释放结构。

【讨论】:

  • 所以,为了确保我理解,CFGregorianDate 是一个 C 结构,因此我必须自己发布它,是吗?
  • C 结构可以在堆栈上创建,在这种情况下您不必释放它们。如果您调用allocmalloc 之类的内存分配函数在堆上分配它,那么您需要调用free 来释放内存。如果你只是在你的函数中声明了一个并填充了它,那么它是一个堆栈变量,当你离开函数时它的内存将被释放。
  • release 专门用于 Objective-C 对象。你永远不会在 C 结构上调用 release
  • 我很困惑...必须不止是 C 类型结构或类...你能给我一些例子吗?
  • 在使用 Foundation/C 库时,您还需要查找内存语法约定。 'create' 和 'new' 都返回必须释放的非目标 C 对象(因此在这种情况下,CGImageCreateWithImageInRect 你没有平衡,因为它包含单词 create 并且你随后不会在该 CGImageRef 上调用 CGImageRefRelease)。
【解决方案2】:

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

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

【讨论】:

  • 也很棘手:由于免费桥接,您可以在 CFArrayCreate 等的结果上调用方法。
  • 虽然不在 ARC 下,但您需要桥接 cast 或 CFBridging*()
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2015-01-28
    • 2021-09-29
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多