【问题标题】:ARC clarification: Will my class extension properties be released automatically?ARC 澄清:我的类扩展属性会自动释放吗?
【发布时间】:2013-01-08 07:20:06
【问题描述】:

我是 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 ARC 也会释放这些属性 在不同的文件中扩展(我的communicationClass.h)?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 当他说他正在向第 3 方类添加属性时,你为什么说他正在使用类扩展?
    • @trojanfoe @interface AFHTTPRequestOperation() 声明一个类扩展,而不是一个类别。 Plus 类别不允许添加属性,只能添加方法。
    • 这对 OP 有效的唯一原因是因为他们正在扩展 AFNetworking 并且他们在项目中有源代码。
    • 但是你怎么知道他有源代码呢​​?他没有说他做到了。
    • @mttrb 类扩展确实允许属性声明,以及方法和 ivar 声明。
    【解决方案2】:

    您的延期将由 ARC 处理。

    您不必担心。

    如果你在@property 中使用weakstrong 会很好看

    【讨论】:

      【解决方案3】:

      我会说“是的”,它们将为您管理,这基于此 blog article 讨论如何使用 objc_setAssociatedObject() 在类别中管理属性。作者在文末指出:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 另一个问题是“这是答案还是评论?”
        猜你喜欢
        • 2011-12-11
        • 1970-01-01
        • 2013-07-10
        • 1970-01-01
        • 2012-01-08
        • 2017-08-27
        • 1970-01-01
        • 2012-06-16
        • 2012-01-07
        相关资源
        最近更新 更多