【问题标题】:Why the code does not work to avoid Circular References?为什么代码不能避免循环引用?
【发布时间】:2016-08-07 14:51:53
【问题描述】:

我正在编译代码以避免 Retain Cycle,当我使用 weak 时,出现此错误:1. property of weak attribute must be of object type; 2. Unknown type name 'OrderEntry'。代码有什么问题?谢谢!

// OrderEntry.h
#import <Foundation/Foundation.h>
#import "OrderItem.h"
#import "Address.h"

@interface OrderEntry : NSObject

 @property (strong, nonatomic)OrderItem *orderItem;
 @property (strong, nonatomic)Address *shippingAddress;
 @property (strong, nonatomic) NSString *orderID;

@end


// OrderItem.h
#import <Foundation/Foundation.h>
#import "OrderEntry.h"


@interface OrderItem : NSObject

 @property (strong,nonatomic) NSString *name;

 @property (weak, nonatomic) OrderEntry *entry;

 @end

【问题讨论】:

    标签: objective-c weak-references circular-reference


    【解决方案1】:

    问题在于两个 .h 文件都包含另一个。这会导致对声明的循环依赖。简单的解决方案是改用前向声明。

    OrderEntry.h:

    #import <Foundation/Foundation.h>
    #import "Address.h"
    
    @class OrderItem;
    
    @interface OrderEntry : NSObject
    
     @property (strong, nonatomic) OrderItem *orderItem;
     @property (strong, nonatomic) Address *shippingAddress;
     @property (strong, nonatomic) NSString *orderID;
    
    @end
    

    OrderItem.h:

    #import <Foundation/Foundation.h>
    
    @class OrderEntry;
    
    @interface OrderItem : NSObject
    
     @property (strong, nonatomic) NSString *name;
     @property (weak, nonatomic) OrderEntry *entry;
    
    @end
    

    然后你在 .m 文件中导入 .h 文件。

    一般准则是在另一个 .h 文件中导入尽可能少的 .h 文件。尽可能对类和协议使用前向声明。

    【讨论】:

    • 谢谢!它成功了!并感谢您提供的一般准则。
    猜你喜欢
    • 2015-09-05
    • 2012-06-24
    • 2016-12-22
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多