我有一个项目结构,其中:
•ClassA
强烈引用ClassB
•ClassAA
子类ClassA
并强烈引用ClassBB
•ClassB
对ClassA
(名为state
并使用@class ClassA;
定义)的弱引用
•ClassBB
子类ClassB
并将state
重载为ClassAA
并使用@class ClassAA;
来执行此操作
由于state
中的ClassBB
过载,编译器无法判断ClassAA
是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
答案 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想要为您做的类型检查,并允许您在实现中保持灵活性。