gpt4 book ai didi

ios - __autoreleasing 用于 ARC Objective-C 中的返回值

转载 作者:行者123 更新时间:2023-11-29 10:39:28 25 4
gpt4 key购买 nike

根据 Cocoa 的“创建规则”,返回新实例化对象的方法必须以 newcreatecopy 开头,如果所有权转移给调用者。

假设我有一个实现名为 (NSObject *)getCorrectObject 的工厂方法的类。

此方法将返回被调用者正确子类的新实例(由被调用者的某些内部状态决定)。从技术上讲,此方法不遵循“创建规则”,并可能导致非 ARC 环境中的内存泄漏。

在这种情况下是否可以使用 (NSObject *__autoreleasing)getCorrectObject 来避免使用 newcreate

在非 ARC 中,我会返回一个自动释放的对象,但我不完全确定 __autoreleasing 是否适用于 In/Out 参数以外的任何东西。

最佳答案

According to Cocoa's "Create Rule" a method that returns a newly instantiated object must begin with either new, create, or copy if ownership is transferred to the caller.

这不称为创建规则(并且不正确)。创建规则是 Core Foundation rule与“创建”和“复制”这两个词相关。 cocoa 有a different rule与“alloc”、“new”、“copy”或“mutableCopy”相关。

Let's say I have a class that implements a factory method called (NSObject *)getCorrectObject.

那么它就会被错误地命名。以get 开头的方法表示它通过引用返回一个值。正确的签名是:

+ (BOOL)getCorrectObject(NSObject**)result;

This method will return a new instance of the correct subclass of the callee (determined by some internal state of the callee). Technically this method does not follow the "Create Rule" and could lead to memory leaks in non-ARC environments.

那不是根据它是否是一个新的实例。它基于它是否包含一个不平衡的retain

以“alloc”、“new”、“copy”或“mutableCopy”开头的方法应该返回一个带有一个不平衡retain的对象。其他方法应返回一个对象,该对象附加了相同数量的 retainautorelease

如果出于某种原因你必须违反这些命名规则(并且你真的不想违反这些规则),向 ARC 指示它的正确方法是使用 NS_RETURNS_RETAINED (查看所有宏的Foundation/NSObjCRuntime.h)。这只会帮助 ARC 在处理混合 ARC/Retain 代码时正确修复内存管理,以防无法修复您的错误命名。纯 ARC 代码不需要这个;无论哪种方式都会平衡。纯保留代码不会受此帮助。来电者必须做正确的事(因此必须知道你做错了并进行补偿)。

请注意,只要您在整个项目中都在使用 ARC(而且您真的、真的应该这样做),其中大部分在实践中都不会很重要。无论您如何命名,ARC 都会为您平衡一切,因为无论如何您都不负责添加保留、发布和自动发布。

关于ios - __autoreleasing 用于 ARC Objective-C 中的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com