有没有人知道为什么即使在First中导入SecondViewController.h后,FirstViewController中也无法识别声明?
这是SecondViewController.h中的代码
@property (nonatomic, copy) NSString *query;
我正在尝试在FirstViewController中使用它。但它给了我错误 -
#import "FirstViewController.h"
#import "SecondViewController.h"
-(IBAction)searchButtonPressed:(id)sender {
FirstViewController *viewController = [[FirstViewController alloc] initWithNibName:@"ViewController" bundle:nil];
viewController.query = [NSString stringWithFormat:@"%@",
search.text];
[[self navigationController] pushViewController:viewController
animated:YES];
[viewController release];
}
“查询”无法识别。即使SecondViewController.h是在FirstViewController的实现文件中导入的。
答案 0 :(得分:1)
它被称为循环包含。每个标题#import
是另一个 - 这将是第一个?
使用前瞻声明:
<强>之前强>
#import "A.h"
@interface B : NSObject
...
<强>后强>
@class A; // << forward declaration instead of import
@interface B : NSObject
...
更详细地说:#import
就像#include
一样有一个包含守卫。
#include
就像将包含文件的内容复制到另一个文件(以及它包含的所有文件)中。
如果两个标题包含另一个,则为圆形包含。在C中,如果两个头部依赖于另一个头部中的声明,则会导致错误 - 它将遇到无法识别的标识符。
现在,您可以使用前向声明来避免此问题:@class SomeClass;
。这告诉编译器有一个名为SomeClass
的ObjC类 - 因此,它不需要发出编译错误。
答案 1 :(得分:0)
// -------------- FirstViewController.h
@class SecondViewController;
@interface FirstViewController : UIViewController {
SecondViewController *secondViewController;
}
@end
// -------------- FirstViewController.m
#import "FirstViewController.h"
#import "SecondViewController.h"
@implementation FirstViewController
-(id)init {
[super init];
secondViewController = [[SecondViewController alloc] init];
return self;
}
@end