在接口文件中:何时对自定义类使用前向声明,而不仅仅是包含其标头



我有一个名为FullScreenViewControllerUIViewController子类,它具有类型为ImageScrollView的属性,该属性UIScrollView对象子类化。实现和接口如下所示:

FullScreenViewController.h

#import <UIKit/UIKit.h>
@class ImageScrollView;
@interface FullScreenViewController : UIViewController 
{
    ImageScrollView *_scrollView;
}
@property(nonatomic, retain) ImageScrollView *scrollView;
@end

FullScreenViewController.m

#import "FullScreenViewController.h"
#import "ImageScrollView.h"
@implementation FullScreenViewController
@synthesize scrollView = _scrollView;
...
@end

现在我子类FullScreenViewController,我尝试从ImageScrollView属性访问任何属性,但不断收到错误消息:"找不到属性"。当我ImageScrollView.h添加到子类时,它可以工作,但我不明白这一点。我已经在FullScreenViewController中添加了ImageScrollView.h,为什么我必须再次添加它?

更新:我没有使用前向类声明,而是在 FullScreenViewController.h 中包含 ImageScrollView.h。我有点困惑为什么我曾经使用前向声明而不是只包含 .h 文件?

您需要添加它的原因是您在 FullScreenViewController.h 文件中只有一个@class声明。这仅声明 ImageScrollView* 类型的变量作为指向类 ImageScrollView 对象的指针。它不允许您访问 ImageScrollView 的属性。要访问特定于ImageScrollView的方法和属性,您需要包含ImageScrollView的@interface声明,我假设该声明位于ImageScrollView.h文件中。

给定标题:

@interface FullScreenViewController : UIViewController 
{
    ImageScrollView *_scrollView;
}
@property(nonatomic, retain) ImageScrollView *scrollView;
@end
只需要

一个前向声明@class ImageScrollView即可。这告诉编译器有一个名为 ImageScrollView 的 objc 类。

当然,使用前向声明,界面在您需要使用它的地方是不可见的,除非您也在使用它的地方#import ImageScrollView。

现在我子类 FullScreenViewController,我尝试从 ImageScrollView 属性访问任何属性,但我不断收到错误消息:"找不到属性"。当我将ImageScrollView.h添加到子类时,它可以工作,但我不明白这一点。我已经在 FullScreenViewController 中添加了 ImageScrollView.h,为什么我必须再次添加它?

ImageScrollView的声明对子类FullScreenViewControllerSubclass不可见。 ImageScrollView.h仅在#import编辑的地方可见。 FullScreenViewController.mFullScreenViewControllerSubclass.m不可见。因此,您必须FullScreenViewControllerSubclass.m编写另一个#import才能在那里使用ImageScrollView

更新:我没有使用前向类声明,而是在 FullScreenViewController.h 中包含 ImageScrollView.h。我有点困惑为什么我曾经使用前向声明而不是只包含 .h 文件?

使用转发实现快速构建时间和理智、受控的依赖关系结构。这是一个非常耗时的撤消问题。随着程序和库大小的增加,这个问题会变得更糟:

您是否希望对中型项目中的页眉进行更改,要求重新编译 50 个源,每次翻译的平均预处理输入为 150,000 行,或者您是否希望该更改影响 6 个源,每个翻译的平均预处理输入为 40,000 行?这里的区别在于,微小的更改需要从几秒钟到几分钟的增量重建才能完成,具体取决于您构建依赖项和导入的方式。

您是否尝试过使用别名_scrollView或scrollView访问它。您应该使用_scrollView访问它,并查看是否已将文件导入.m或.h,因为@class是不够的。

相关内容

最新更新