我有一个项目结构,其中:
•ClassA
强烈引用了ClassB
•ClassAA
子类ClassA
并强烈引用ClassBB
•ClassB
对ClassA
有弱引用(命名为state
并使用@class ClassA;
定义)
•ClassBB
子类ClassB
和重载state
成为ClassAA
并使用@class ClassAA;
这样做
由于state
中的重载ClassBB
,编译器无法判断ClassAA
是ClassA
的子类。因此,我得到这个警告:
属性类型“classaa*”与从“classb”继承的类型“classa*”不兼容`
我怎样才能告诉编译器我知道自己在做什么,这样警告就会隐藏起来?谢谢你的建议。下面是创建此警告的项目结构:
甲级
#import <Foundation/Foundation.h>
#import "ClassB.h"
@interface ClassA : NSObject
@property (strong)
ClassB* view;
@end
B.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
类bb.h(继承自类b)
#import "ClassB.h"
@class ClassAA;
@interface ClassBB : ClassB
@property (weak)
ClassAA* state; <-- Where the warning is occurring
@end
最佳答案
这无疑是CalangObjuleC前端的一个实现问题的质量;代码没有什么问题,所以唯一的问题是如何哄骗编译器暂时关闭。
如果你改变你的“CaseBB.H”看起来像这样,那么它将在没有警告的情况下编译,而[[ClassBB new] state]
仍然会有正确的静态类型(即ClassAA*
,而不是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
我不认为有人会把这种类布局称为“最佳实践”,但至少它是一种干净的方式来编写这种不是真正的循环依赖关系。(注意完全不存在)。在我看来,
@class
是一种代码味道。这个头文件不负责定义@class
,所以它应该由“class a a.h”决定ClassAA
是objective-c类、typedef、宏还是其他类。)