.hファイルと.mファイルの@interface定義の違い


81

通常は使用します

@interface interface_name : parent_class <delegates>
{
......
}
@end 

.hファイルと.mファイルのメソッドは、.hファイルで宣言された変数のプロパティを合成します。

ただし、一部のコードでは、この@interface ..... @endメソッドは.mファイルにも保持されます。どういう意味ですか?それらの違いは何ですか?

また、.mファイルで定義されているインターフェイスファイルのゲッターとセッターについても説明します。

前もって感謝します

回答:


63

@interfaceプライベートメソッドを含むカテゴリを定義する追加を配置するのが一般的です。

Person.h:

@interface Person
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end

Person.m:

@interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented.

-(void)startThinkOfWhatToHaveForDinner;
@end


@implementation Person

@synthesize name = _name;

-(NSString*)makeSmallTalkWith:(Person*)person
{
    [self startThinkOfWhatToHaveForDinner];
    return @"How's your day?";
}


-(void)startThinkOfWhatToHaveForDinner
{

}

@end

「プライベートカテゴリ」(名前のないカテゴリの適切な名前は「プライベートカテゴリ」ではなく、「クラス拡張子」です).mは、コンパイラがメソッドが定義されていることを警告するのを防ぎます。ただし、@interface.mファイル内のはカテゴリであるため、ivarを定義することはできません。

2012年8月6日更新:Objective-Cは、この回答が書かれてから進化しました。

  • ivars クラス拡張で宣言することができます(そして常にそうすることができます-答えは間違っていました)
  • @synthesize 必須ではありません
  • ivars@implementation:の上部を中括弧で宣言できるようになりました。

あれは、

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end

4
小さな補足ですが、プライベートインターフェイスを宣言するときは、実際には括弧内に何も入れないでください。それ以外の場合は、カテゴリを作成するだけであり、それは望ましくありません。@interface Person ()十分であろう。
Itai Ferber 2010年

itaiferberに感謝します、私はそれに気づいていませんでした。回答を更新しました。
ベネディクトコーエン

4
人々がカテゴリーについてもっと知りたいと思っているなら..このページは私にとって非常に役に立ちました。
ティム

1
カッコ内の何もない場合、これは実際に呼び出されclass extensionていないcategory
Paul.s

5
@ giant91この回答はかなり古く、コンパイラは最初に作成されてから大幅に改善されています。メソッド本体が「表示」されている場合、コンパイラはメソッドの宣言を必要としなくなりました。これは、クラス継続(@interface className ())が一般的にプライベートを含むようになることを意味し@propertyます。
ベネディクトコーエン

10

概念は、.hをクラスのパブリックインターフェイスに制限し、プライベート実装の詳細をこのクラス拡張に配置すると、プロジェクトをよりクリーンにすることができるということです。

ABC.hファイルで変数メソッドまたはプロパティを宣言すると、これらの変数のプロパティとメソッドがクラスの外部からアクセスできることを意味します

@interface Jain:NSObject
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end

@Interfaceを使用すると、プライベートivar、プロパティ、およびメソッドを宣言できます。したがって、ここで宣言したものには、このクラスの外部からアクセスすることはできません。一般に、すべてのivar、プロパティ、およびメソッドをデフォルトでプライベートとして宣言する必要があります

ABC.mファイルで変数のメソッドまたはプロパティを宣言すると、これらの変数のプロパティとメソッドはクラスの外部からアクセスできないことを意味します。

@interface Jain()
    {
        NSString *_name;
    }

    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)jain;
    @end

0

.mファイルで他のクラスを作成することもできます。たとえば、.hファイルで宣言されたクラスを継承するが、動作が少し異なる他の小さなクラスです。これをファクトリパターンで使用できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.