通常的 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 到任何类型的桥梁,由于缺乏上下文,必须明确管理保留计数和/或周期。它不会从您那里拿走任何东西,在大多数情况下提供了根本不管理资源的巨大优势。