38

なぜ2回あるのだろうか@interface。1つとclass.h他のclass.m。例えば:

TestTableViewController.h

#import <UIKit/UIKit.h>

@interface TestTableViewController : UITableViewController

@end

そして(自動的に生成された)class.m私は見つけます:

#import "TestTableViewController.h"

@interface TestTableViewController ()

@end

@implementation TestTableViewController

... methods delegated from UITable delegates

@end

だから私の質問は、ファイルの内容が何であるかということ@interface TestTableViewController ()です.m。なぜそこにあるのですか?必要ですか?

前もって感謝します

4

4 に答える 4

56

2番目の@interfaceディレクティブは実装ファイル(.m)にあります。これは、クラスの作成者がクラスのユーザーに公開したくないものを宣言するためのものであると推測できます。これは通常、プライベートおよび/または内部のメソッドとプロパティを意味します。また、これを行うには2つのタイプがあることに注意してください。1つ(ここに表示されます)は「クラス拡張」と呼ばれ、空の括弧のペアで示されます。

@interface MyClass ()

これを使用してクラスにインスタンス変数を追加できるため、これは特に重要です。

「カテゴリ」と呼ばれる2番目のカテゴリは、空でない括弧のペアで示され、次のようにカテゴリの名前を囲みます。

@interface MyClass (CategoryName)

また、クラスを拡張するためにも使用されます。カテゴリを使用してインスタンス変数をクラスに追加することはできませんが、同じクラスに複数のカテゴリを含めることができます。これが、ソースコードがないシステム/フレームワーククラスを拡張するために主に使用される理由です。この意味で、カテゴリはクラス拡張の正反対です。

于 2012-07-21T17:45:33.187 に答える
3

2番目の「インターフェイス」は「TestTableViewController」クラスの拡張機能を定義します。これは、hファイルのみをインポートするユーザーには表示されません。これは、ObjectiveCでプライベートメソッドを作成するための事実上の方法です。

于 2012-07-21T17:39:57.923 に答える
2

そこで、クラスでのみ使用し、他のクラスには公開しないプライベートメソッドとプロパティを宣言できます。

于 2012-07-21T17:35:11.400 に答える
2

ファイル内のインターフェースはTestTableViewController.h、クラス拡張子の宣言です。これを示す2つの丸括弧があります。構文は、クラスのカテゴリを作成する場合と同じです。ただし、この場合、作成者がヘッダーファイルで公開したくないある種のプライベートメソッドを宣言するために使用されます

通常のカテゴリインターフェイスは次のようになります。

@interface TestTableViewController (Your_Category_Name)
- (void)doSomething;
@end

そして対応する実装:

@implementation TestTableViewController (Your_Category_Name)
-(void)doSomething {
// Does something...
}
@end

この例では、カテゴリ名が指定されていないため、クラスを拡張するだけで、通常の実装でメソッドを実装できます。

通常、この手法はメソッドを「非表示」にするために使用されます。これらはヘッダーファイルで宣言されておらず、.hファイルのみをインポートした場合は表示されません。

于 2012-07-21T17:41:43.967 に答える