web-dev-qa-db-ja.com

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

通常使用します

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

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

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

また、.mファイルで定義されているインターフェイスファイルのゲッターとセッターに関するいくつかの単語を与えます...

前もって感謝します

80
Rajkanth

プライベートメソッドを含むカテゴリを定義する@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は、メソッドが定義されていることをコンパイラが警告しないようにします。ただし、.mファイルの@interfaceはカテゴリであるため、ivarを定義できません。

12年8月6日更新:この答えが書かれて以来、Objective-Cは進化しています。

  • ivarsはクラス拡張で宣言できます(常にそうでした-答えは間違っていました)
  • @synthesizeは不要です
  • ivars@implementationの先頭に中括弧で宣言できるようになりました。

あれは、

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end
62
Benedict Cohen

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

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

@interface Jain:NSObject
{
    NSString *_name;
}

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

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

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

@interface Jain()
    {
        NSString *_name;
    }

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

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

0