- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据 Cocoa 的“创建规则”,返回新实例化对象的方法必须以 new
、create
或 copy
开头,如果所有权转移给调用者。
假设我有一个实现名为 (NSObject *)getCorrectObject
的工厂方法的类。
此方法将返回被调用者正确子类的新实例(由被调用者的某些内部状态决定)。从技术上讲,此方法不遵循“创建规则”,并可能导致非 ARC 环境中的内存泄漏。
在这种情况下是否可以使用 (NSObject *__autoreleasing)getCorrectObject
来避免使用 new
或 create
?
在非 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
的对象。其他方法应返回一个对象,该对象附加了相同数量的 retain
和 autorelease
。
如果出于某种原因你必须违反这些命名规则(并且你真的不想违反这些规则),向 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/
我在返回错误的 Apple 函数中注意到了这种模式 error:(NSError *__autoreleasing *)outError 我理解它的意思,它是指向指针的指针,用于执行结果(仅使用 *
在 AFNetworking 中我找到了这个函数: - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
我有一个街区; typedef void (^SIResponseHandler) (id obj, NSString *error); 和方法: + (void)uploadPhoto:(UIIma
如何使变量的地址成为 NSObject 中的强属性?我有一个名为 SCPFMessageThreadQuery 的类,它是通过传递 SCPFMessageThread 变量的地址来分配初始化的。 @i
所以我像往常一样将一个指向 NSError 对象的指针传递给一个方法。它曾经很简单: -(BOOL)foo:(NSString *)string error:(NSError **)error 但是对
我拼命想了解 __autoreleasing 关键字在 Objective-C 中的用法。我已仔细阅读以下问题的答案: In which situations do we need to write
根据 Transitioning to ARC Release Notes : __autoreleasing is used to denote arguments that are passed
有人可以向我解释在以下示例代码块中使用 __autoreleasing 的目的吗? - (void)execute:(NSError * __autoreleasing *)error { /
我一直都知道这种模式是管理 NSError** 参数(特别是 BOOL 返回值和 NSError* __autoreleasing * 参数: -(BOOL)doSomethingWithString
我正在尝试将旧的非 ARC 项目转换为 ARC,但出现此编译错误:“无法在 block 中捕获 __autoreleasing 变量” - (void)animateViewController:(_
-(NSData *)jsonRepresentation:(NSError **error)error { NSDictionary *dict = [self getDictRepresen
考虑这段代码: @implementation MyClass -(void)dealloc { NSLog(@"MyClass dealloc: %@", self); } @end @im
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: In which situations do we need to write the __autorele
根据 Cocoa 的“创建规则”,返回新实例化对象的方法必须以 new、create 或 copy 开头,如果所有权转移给调用者。 假设我有一个实现名为 (NSObject *)getCorrectO
在学习 NSInvocations 时,我对内存管理的理解似乎存在差距。 这是一个示例项目: @interface DoNothing : NSObject @property (nonatomic,
我正在尝试完成这个谜题。 __strong 是所有 Objective-C 可保留对象指针(如 NSObject、NSString 等)的默认值。它是一个强引用。 ARC 在作用域末尾用 -relea
为什么 Apple 的方法没有将 NSError** 声明为 NSError * __autoreleasing * ? Transitioning to ARC Release Notes似乎暗示他
我正在尝试从 id __autoreleasing * 转换为 CFTypeRef * (void **)。 我试过: id __autoreleasing *arg = [OCMArg setTo:
在 ARC 下,输出参数采用以下形式(默认情况下;这等同于 NSError **): - (BOOL)tryWithError:(NSError *__autoreleasing *)err; 来自T
我正在尝试使用 PowerPlot 库绘制条形图。因此,我发现只有这个代码可以满足我对负条以及阴影或不透明度的要求。原始示例项目不使用 ARC。但是我的项目使用 ARC。在复制相同的代码时,我在编译项
我是一名优秀的程序员,十分优秀!