ARC澄清:我的类扩展属性是否会自动释放?

时间:2013-01-24 13:52:43

标签: ios objective-c properties automatic-ref-counting

我是ARC的新手,我没有问题,我没有找到有关的信息。

我正在编写通信类,我想向第三方类添加属性。 我在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,ARC也会发布这些属性 是在另一个文件(我的communicationClass.h)?

中扩展的

4 个答案:

答案 0 :(得分:0)

问题是,如果使用ARC支持编译AFHTTPRequestOperation类。当答案时,ARC将处理此问题。否则,它不会,答案是

另一件事是使用ARC时retain应为strong

答案 1 :(得分:0)

您的分机将由ARC处理。

您无需担心。

如果您在weak

中使用strong@property,那会很好看

答案 2 :(得分:0)

我会说“是”,它们将由您管理,这基于此blog article,其中讨论了如何使用objc_setAssociatedObject()按类别管理属性。在文章的最后,作者说:

  

注意:当取消分配类对象(UIView对象)时,其属性   (animationIdentifer)将自动发送一条消息。

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

答案 3 :(得分:0)

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

Apple的Programming with Objective-C有关于课程扩展的说法:

  

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

  

与常规类别不同,类扩展可以添加自己的类别   属性和类的实例变量。如果你宣布一个   类扩展中的属性,编译器会自动执行   合成相关的访问器方法,以及一个实例   变量,在主类实现中。

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

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

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