由于循环依赖性,重载的弱引用的属性类型与从超类继承的类型不兼容

时间:2014-05-25 19:37:50

标签: objective-c

我有一个项目结构,其中:

ClassA强烈引用ClassB

ClassAA子类ClassA并强烈引用ClassBB

ClassBClassA(名为state并使用@class ClassA;定义)的弱引用

ClassBB子类ClassB并将state重载为ClassAA并使用@class ClassAA;来执行此操作

由于state中的ClassBB过载,编译器无法判断ClassAAClassA的子类。因此,我收到了这个警告:

属性类型'ClassAA *'与继承自'ClassB'`

的类型'ClassA *'不兼容

我怎么能告诉编译器我知道我在做什么,所以警告隐藏起来了?谢谢你的建议。以下是创建此警告的项目结构:

ClassA.h

#import <Foundation/Foundation.h>
#import "ClassB.h"

@interface ClassA : NSObject

@property (strong)
ClassB* view;

@end

ClassB.h

#import <UIKit/UIKit.h>
@class ClassA;

@interface ClassB : UIView

@property (weak)
ClassA* state;

@end

ClassAA.h (继承自ClassA)

#import "ClassA.h"
#import "ClassBB.h"

@interface ClassAA : ClassA

@property (strong)
ClassBB* view;

@end

ClassBB.h (继承自ClassB)

#import "ClassB.h"
@class ClassAA;

@interface ClassBB : ClassB

@property (weak)
ClassAA* state; <-- Where the warning is occurring

@end

2 个答案:

答案 0 :(得分:1)

这肯定是Clang Objective-C前端的实施质量问题;您的代码没有任何问题,因此唯一的问题是如何欺骗编译器关闭片刻。

如果您将“ClassBB.h”更改为如此,那么它将在没有警告的情况下进行编译 - [[ClassBB new] state]仍将具有正确的静态类型(即ClassAA*,而不是{{1 }})。

ClassA*

我认为没有人会把这个类布局称为“最佳实践”,但至少它是一种干净利落的方式来编写这种非真正循环的依赖。 (注意完全没有#import "ClassB.h" // #imports required by is-a relationships @interface ClassBB : ClassB @end // define the is-a relationships #import "ClassAA.h" // #imports required by has-a relationships @interface ClassBB() // define the has-a relationships @property (weak) ClassAA* state; @end 声明.IMO,@class是一种代码气味。这个头文件不负责定义@class,因此它应该让它保持“ClassAA”。 h“ClassAA是否是Objective-C类,typedef,宏或其他东西。)

答案 1 :(得分:1)

这可能是使用协议的好地方。 定义CassAConforming协议和ClassBConforming协议。 在基类中创建属性id和id。 然后使您的子类符合这些协议。 这为您提供了Xcode想要为您做的类型检查,并允许您在实现中保持灵活性。