0

我正在使用 Metal API(目标 C)和 MRC(手动引用计数)编写 C++ 应用程序。我对 ObjC 的经验非常有限。大多数 Metal API 对象被定义为协议并创建为从 C 函数或其他对象的方法返回的对象(例如 MTLDevice newBufferWithLength)。要知道如何释放以这种方式创建的对象,我需要知道它们是否已设置为自动释放(例如,我不能调用 release 保留计数为 1 的自动释放对象)。问题是我在 Metal API 文档中找不到任何可以回答这个问题的描述。我只在用户指南中读过所有所谓的轻量级对象都是自动释放的。有三个自动释放对象的示例,但不确定我是否可以假设其余对象不是自动释放的。

谢谢您的帮助。

4

1 回答 1

2

通常的 Objective-C 规则是创建范围也负责释放对象。因此,几乎在所有情况下,除了有据可查的异常,返回的对象都是自动释放的(都通过返回值或输出参数返回)。更正确的查看方法是始终以 +0 scope-local retain count返回对象,因此如果需要,您应该保留它。阅读手册,Metal API 似乎是 Apple 的框架之一,因此除非用粗体声明警告,否则它应该遵循此规则。Objective-C 中的 C 函数也应该以这种方式运行。(就资源管理而言,方法和函数没有区别。)

对于“alloc-init vs. [NSString string]”部分:MRC 代码要么返回 [NSString string],它已经是 +0,要么返回 [[[NSString alloc] init] autorelease]。否则它违反了约定。异常是返回 +1-[init]+[new...]方法本身。在 ARC 下,alloc-init/string 之间没有区别,因为 ARC 知道约定并且做正确的事,尽可能优化过多的保留/释放。

另请注意,这-[retainCount]是没有意义的并且“被认为是有害的”,因为您永远不知道执行了多少次保留自动释放调用以及即使对您自己的对象也有效的 objc 运行时记帐。

ARC 确实是一个不错的选择,除非您正在编写某种 Objective-C 到任何类型的桥梁,由于缺乏上下文,必须明确管理保留计数和/或周期。它不会从您那里拿走任何东西,在大多数情况下提供了根本不管理资源的巨大优势。

于 2015-04-16T21:12:45.133 回答