1

我是 ARC 的新手,我几乎没有什么问题没有找到相关信息。

我正在编写通信类,我想将属性添加到第 3 方类。我在我的communicationClass.h

@interface AFHTTPRequestOperation()

@property (nonatomic, assign) id<TargetProtocol> delegate;
@property (nonatomic, assign) SEL callback;
@property (nonatomic, retain) NSString *requestIdentifier;
@property (nonatomic, assign) int authenticationMode;

@end

属性添加得很好,我使用它们。我的问题是,即使AFHTTPRequestOperation 在不同的文件(我的communicationClass.h)中扩展,ARC 也会释放这些属性吗?

4

4 回答 4

0

Yes your extension will be dealt by ARC.

You are not required to worry about it.

And it would look good if you use weak and strong in @property

于 2013-01-24T14:02:34.093 回答
0

我会说“是”,它们将为您管理,这基于这篇博客文章,该文章讨论了如何使用objc_setAssociatedObject(). 在文章的最后作者说:

注意:当类对象(UIView 对象)被释放时,它的属性(animationIdentifer)会自动发送一个-release 消息。

所以我假设ARC会为你做这件事。这不是很权威,我知道...

于 2013-01-24T14:04:01.213 回答
0

您正在使用类扩展(而不是类别)添加其他属性。只有当您有权访问被扩展类的原始源代码时,才能使用类扩展。在这种情况下,您可能已经将源代码AFNetworking包含在您的项目中。

Apple 的Programming with Objective-C对类扩展有这样的说法:

类扩展与类别有一些相似之处,但它只能添加到您在编译时拥有源代码的类(该类与类扩展同时编译)。类扩展声明的方法在原始类的@implementation 块中实现,因此您不能在框架类(例如 Cocoa 或 Cocoa Touch 类(如 NSString)上)声明类扩展。

与常规类别不同,类扩展可以将自己的属性和实例变量添加到类中。如果您在类扩展中声明属性,[...] 编译器将在主类实现中自动合成相关的访问器方法以及实例变量。

这表明由类扩展添加的属性将与它们在原始实现文件中的功能完全相同。communicationClass.h但是,文档建议类扩展应该与原始实现同时编译,如果不包含在原始AFHTTPRequestOperation.m实现文件中,我不清楚这是如何发生的。

鉴于这些属性对您有用,我不得不假设 Objective-C 运行时正在识别它们,这可能意味着 ARC 将正常工作。

这可能值得测试。为了检查 ARC 是否正确释放了该属性,我将向dealloc您存储在使用此方法添加的属性中的类的方法添加一些日志记录。如果在dealloc父级被销毁时调用它,那么你就会知道它正在工作。

于 2013-01-24T14:14:05.410 回答
0

问题是,如果AFHTTPRequestOperation类是在 ARC 支持下编译的。如果答案是肯定的,那么 ARC 会处理这个问题。否则,它不会,答案是否定的。

另一件事是在使用 ARC 时retain应该这样做。strong

于 2013-01-24T13:55:38.373 回答