我有一个项目结构,其中:
ClassA强烈引用了ClassB
ClassAA子类ClassA并强烈引用ClassBB
ClassBClassA有弱引用(命名为state并使用@class ClassA;定义)
ClassBB子类ClassB和重载state成为ClassAA并使用@class ClassAA;这样做
由于state中的重载ClassBB,编译器无法判断ClassAAClassA的子类。因此,我得到这个警告:
属性类型“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、宏还是其他类。)

09-11 18:35