我正在使用Metal API(目标C)和MRC(手动参考计数)编写C ++应用程序。我对ObjC的经验非常有限。大多数Metal API对象被定义为协议,并被创建为从C函数或其他对象的方法(例如MTLDevice newBufferWithLength)返回的对象。要知道如何释放以这种方式创建的对象,我需要知道它们是否已经设置为自动释放(我不能调用释放自动释放的对象,例如保留计数为1)。问题是我无法在Metal API文档中找到任何可以回答这个问题的描述。我只是在用户指南中读到所有所谓的轻量级对象都是自动释放的。有三个自动释放对象的例子,但不确定我是否可以假设其余的对象没有自动释放。在cocoa中,许多对象也可以在没有alloc + init的情况下创建,从静态方法返回(从NSString字符串开始),所以问题似乎不仅仅是与Metal相关。
感谢您的帮助。
答案 0 :(得分:2)
通常的Objective-C规则是创建范围也负责释放对象。因此,几乎在所有情况下,除了记录良好的异常外,返回的对象都是自动释放的(都通过返回值或out-arguments返回)。更正确的方法是查看该对象始终返回+0 范围 - 本地保留计数,因此如果需要,您应该保留它。阅读手册似乎Metal API是Apple的框架之一,所以它应该遵循这条规则,除非用粗体语句警告。 Objective-C中的C函数也应该以这种方式运行。 (在资源管理方面,方法和功能没有区别。)
对于“alloc-init vs. [NSString string]”部分:MRC代码返回[NSString string],它已经是+0,或[[[NSString alloc] init] autorelease]。否则它违反了惯例。例外-[init]
和+[new...]
方法本身会返回+1。在ARC下,alloc-init / string之间没有区别,因为ARC知道约定并做正确的事情,尽可能优化过多的保留/释放。
另请注意,-[retainCount]
没有意义且“被视为有害”,因为您永远不知道执行了多少retain-autorelease调用以及即使使用您自己的对象,objc-runtime accounting仍然有效。
ARC是一个很好的选择,除非您正在编写某种Objective-C-to-Whatever bridge,其中由于缺少上下文,必须明确管理保留计数和/或周期。它不会带给你任何东西,在大多数情况下会给你一个不管理资源的巨大优势。