gpt4 book ai didi

objective-c - 由于循环依赖,重载弱引用的属性类型与从父类(super class)继承的类型不兼容

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:37 27 4
gpt4 key购买 nike

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

ClassA强烈引用 ClassB

ClassAA子类 ClassA并强烈引用 ClassBB

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

ClassBB子类 ClassB和重载 state成为ClassAA并使用 @class ClassAA;这样做

因为重载stateClassBB ,编译器无法判断 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

最佳答案

这肯定是 Clang Objective-C 前端中的实现质量问题;您的代码没有任何问题,所以唯一的问题是如何诱使编译器暂时关闭。

如果您将“ClassBB.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 声明。IMO,@class 是一种代码味道。这个头文件不负责定义 ClassAA ,因此无论 ClassAA 是 Objective-C 类、typedef、宏还是其他东西,都应该由“ClassAA.h”决定。)

关于objective-c - 由于循环依赖,重载弱引用的属性类型与从父类(super class)继承的类型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23859232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com