我有一个称为UIViewControllerFullScreenViewController子类,该子类具有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添加到子类时,它可以工作,但是我不理解这一点。我已经在ImageScrollView.h中添加了FullScreenViewController,为什么还要再次添加呢?

更新:我没有使用前向类声明,而是在FullScreenViewController.h中包含了ImageScrollView.h。关于为什么我曾经使用前向声明而不是仅包含.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不可见。因此,必须在#import中编写另一个FullScreenViewControllerSubclass.m才能在此处使用ImageScrollView

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

使用Forwards可以缩短构建时间并建立合理的受控依赖项结构。这是一个非常耗时的撤消问题。随着程序和库大小的增加,这个问题变得更加严重:

您是希望对中型项目中的标头进行更改,以要求重新编译50个源,每个翻译的平均预处理输入为150,000行,还是希望此更改影响6个源,平均预处理的输入为每个翻译40,000行? ?此处的区别在于,小的更改将使增量重建从几秒钟到几分钟才能完成,这取决于您对依赖项和导入的结构方式。

关于iphone - 在接口(interface)文件中:什么时候对自定义类使用前向声明,而不是仅包含其 header ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10561578/

10-14 14:34