Objective c Objc Cocoa MRC-发布和自动发布的对象我必须给他写信才能看到应用程序 我用金属API(目标C)和MRC(手动引用计数)编写C++应用程序。我对ObjC的经验非常有限。大多数金属API对象都定义为协议,并创建为从C函数或其他对象的方法返回的对象(例如MTLDevice newBufferWithLength)。要知道如何释放以这种方式创建的对象,我需要知道它们是否已设置为自动释放(例如,我不能调用RELATE count为1的自动释放对象)。问题是我在MetalAPI文档中找不到任何可以回答这个问题的描述。我只在《用户指南》中读到,所有所谓的轻量级对象都是自动删除的。这里有三个自动释放对象的示例,但我不确定是否可以假定其余对象没有自动释放。在cocoa中,许多对象也可能是在没有alloc+init的情况下创建的,这些对象是从静态方法(例如NSString)返回的,因此问题似乎不仅仅与金属有关

Objective c Objc Cocoa MRC-发布和自动发布的对象我必须给他写信才能看到应用程序 我用金属API(目标C)和MRC(手动引用计数)编写C++应用程序。我对ObjC的经验非常有限。大多数金属API对象都定义为协议,并创建为从C函数或其他对象的方法返回的对象(例如MTLDevice newBufferWithLength)。要知道如何释放以这种方式创建的对象,我需要知道它们是否已设置为自动释放(例如,我不能调用RELATE count为1的自动释放对象)。问题是我在MetalAPI文档中找不到任何可以回答这个问题的描述。我只在《用户指南》中读到,所有所谓的轻量级对象都是自动删除的。这里有三个自动释放对象的示例,但我不确定是否可以假定其余对象没有自动释放。在cocoa中,许多对象也可能是在没有alloc+init的情况下创建的,这些对象是从静态方法(例如NSString)返回的,因此问题似乎不仅仅与金属有关,objective-c,metal,Objective C,Metal,感谢您的帮助。通常的Objective-C规则是,创建范围也负责释放对象。所以,在几乎所有的情况下,除了记录良好的异常之外,返回的对象都是自动删除的(都是通过返回值或out参数返回的)。更正确的方法是,对象总是以+0范围局部保留计数返回,所以如果需要,您应该保留它。在阅读手册时,金属API似乎是苹果的框架之一,所以除非有大胆的警告,否则它应该遵循这条规则。Objective-C中的C函数也应该以这种方式运行。(在资源管理方面,方法和功能没有区别。) 对于“alloc init vs.[NSStr

感谢您的帮助。

通常的Objective-C规则是,创建范围也负责释放对象。所以,在几乎所有的情况下,除了记录良好的异常之外,返回的对象都是自动删除的(都是通过返回值或out参数返回的)。更正确的方法是,对象总是以+0范围局部保留计数返回,所以如果需要,您应该保留它。在阅读手册时,金属API似乎是苹果的框架之一,所以除非有大胆的警告,否则它应该遵循这条规则。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]
毫无意义,而且“被认为是有害的”,因为即使使用您自己的对象,您也永远不知道执行了多少retain AUTORELASE调用以及objc运行时记帐的效果


ARC确实是一个很好的选择,除非您正在编写某种类型的Objective-C-to-Anwhere桥接,在这种桥接中,由于缺乏上下文,必须显式地管理保留计数和/或周期。它不会从您身上拿走任何东西,在大多数情况下,这给了您一个根本不管理资源的巨大优势。

为什么您不使用ARC就开始一个新的ObjectiveC项目?Wonder附议,除了项目后面没有单词。然而,堆栈溢出太常见了,不能批评询问者的意图。让我们保持兴趣,不要轻视它。因为我需要一个统一的二进制文件(x86和x64),就我所知,ARC是x64独占的。我不确定金属是否遵循这条规则。在API描述中并没有一个词表明它以一种不常见的方式创建了对象。例如:在Metal中,我不确定金属是否遵循这条规则。在API描述中并没有一个词表明它以一种不常见的方式创建了对象。例如::。但在Metal编程指南中:在“Metal中的瞬态和非瞬态对象”一节中,他们建议可以以不同的方式创建MTLBuffer。“created autoreleased”表示它们返回时类似于-[string]+0,“Differential way”在下面稍有描述-通过newWhateverWithArguments(),显然是+1,因为名称以“new”开头。这是为了方便(轻的对象预计会被释放,所以已经+0,重的对象预计很少被创建,所以+1,所以在mrc下你不会调用过多的保留/释放)。这就是为什么我们有-[string]和alloc init——它们在不同的地方都很方便。这不是关于新的所有权规则。谢谢。你睁开了我的眼睛。描述为瞬态的金属对象是通过名称中没有“new”关键字的方法/函数创建的,例如创建自动释放的MTLCommandBuffer对象的“commandBuffer”。另一方面,我们通过包含“new”关键字(如newBufferWithLength)的方法/函数创建了非瞬态(非自动释放)对象。我很好奇为什么苹果没有在《金属指南》中描述这个规则。@gringo001,因为Objective-C世界中的资源管理规则是常识。(如果链接断开,谷歌高级内存管理编程指南)。