1

SecondViewController.h を First にインポートした後でも、宣言が 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 の実装ファイルにインポートされますが。

4

2 に答える 2

1

循環包含といいます。各ヘッダー#importは他のものです -- どちらが最初になりますか?

前方宣言を使用します。

#import "A.h"
@interface B : NSObject
...

@class A; // << forward declaration instead of import
@interface B : NSObject
...

より詳細には、インクルードガードと#import同じです。#include

#includeインクルードされたファイルの内容を他のファイル (およびそれに含まれるすべてのファイル) にコピーするのと同じです。

2 つのヘッダーが他方をインクルードする場合、それは循環インクルージョンです。C では、2 つのヘッダーが他のヘッダーの宣言に依存している場合、エラーが発生します。認識されない識別子に遭遇します。

これで、前方宣言を使用してこの問題を回避できます: @class SomeClass;. これにより、名前付きの ObjC クラスがあることがコンパイラにSomeClass通知されます。したがって、コンパイル エラーを発生させる必要はありません。

于 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 に答える