即使在#import之后,也无法在FirstViewController中识别声明

时间:2012-08-16 13:11:33

标签: iphone ios5 controller

有没有人知道为什么即使在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的实现文件中导入的。

2 个答案:

答案 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