gpt4 book ai didi

ios - 子类化 View Controller : Forward declaration

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:42 24 4
gpt4 key购买 nike

我一直遵循的规则是:

类头文件中的@MyClassName

&&

#import "MyClassName"在实现中

我现在决定子类化我的一个 View Controller 。如果我覆盖一个方法,那么我会收到以下消息:

类消息的接收者'MyClassName'是前向声明

为了克服这个问题,我需要将 #import 放入头文件中,这似乎没有遵循我认为的最佳实践。

如果我误解了 @class 的用法,谁能解释一下?

或者如果我做的正确,有人可以解释一下您需要打破最佳实践并在子类化时在头文件中使用#import 吗?

非常感谢。

编辑:

感谢您的回答。我想我需要添加更多细节来澄清我的情况并希望我的理解。这是我的基类的标题:

#import <UIKit/UIKit.h>
#import "CorePlot-CocoaTouch.h"

@class Organisation;

@interface LongCallDetailViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

在我的实现中我有

#import "Organisation.h"

我的子类头包含以下内容:

#import "LongCallDetailViewController.h"

@interface LongCallSubclassViewController : LongCallDetailViewController

@end

如果我重写子类中的方法并尝试使用组织对象,它会给我上面所述的错误。因此,我要么需要将#import "Organisation.h"添加到基类 header 中,要么将#import "Organisation.h"复制到子类实现文件中。这两个对我来说似乎都是错误的。

非常感谢。

最佳答案

在头文件中,您应该为您子类化的任何类导入其他头文件。您不需要为仅被引用而不是子类化的类导入头文件。例如,头文件可能如下所示:

#import "MySuperClass.h"

@class MyObjectType;

@interface MySubClass : MySuperClass
@property (strong) MyObjectType *value;
@end

编辑:根据您的新编辑,您似乎正在正确编写头文件。当你只声明 @class在范围内,您将无法访问与该类关联的任何选择器或属性。可以用@class声明在您不打算使用该类类型的选择器或属性而只是传递引用的地方(如我在上面描述的标题中所示),但是一旦您想对该对象执行任何其他操作,您将需要导入描述 @interface 的头文件.

定义 @class MyObjectType 时在头文件中,通常预期 #import "MyObjectType.h"出现在关联的源文件中。头文件旨在作为结构声明,而源文件将包含实现。例如,与我上面描述的头文件关联的源文件可能如下所示:

#import "MySubClass.h"

#import "MyObjectType.h"

@implementation MySubClass
- (void)overriddenFunction {
[self.value anObjectTypeSelector];
}
@end

当它们在两个不同的范围内时,您不应该考虑“复制”导入语句。当你转发声明 @class Organisation在你的LongCallDetailViewController头文件,你将有一个 #import "Organisation.h"在你的LongCallDetailViewController源文件。如果您还需要在 LongCallSubclassViewController 中访问此对象的属性和选择器类,你需要#import "Organisation.h"在你的LongCallSubclassViewController实现文件。记住:实现文件不知道彼此的内容;他们只知道头文件的内容。

关于ios - 子类化 View Controller : Forward declaration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26240206/

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