1

有谁知道为什么在 FirstViewController 中导入 SecondViewController.h 后仍无法识别声明?

这是 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];


}

无法识别“查询”。即使在 FirstViewController 的实现文件中导入了 SecondViewController.h。

4

2 回答 2

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 类。

于 2012-08-16T13:19:43.587 回答
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
于 2012-08-16T13:23:12.673 回答