1. ホーム
  2. objective-c

[解決済み] .hと.mファイルにおける@interface定義の相違点

2023-05-25 13:40:26

質問

通常、私たちは

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

.hファイルで宣言された変数のプロパティを、.mファイルで合成しています。

しかし、いくつかのコードでは、この@interface....@endメソッドは.mファイルにも保持されています。これは何を意味するのでしょうか。 両者の違いは何でしょうか?

また、.mファイルで定義されたインターフェイスファイルのゲッターとセッターについて、いくつかの言葉を与えてください。

ありがとうございました。

どのように解決するのですか?

よくあるのは @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 はカテゴリであるため、その中で ivar を定義することはできません。

Update 6th Aug '12: Objective-Cはこの回答が書かれたときから進化しています。

  • ivars はクラス拡張で宣言することができます (そして常にそうすることができます - 答えは不正解でした)。
  • @synthesize は必須ではありません。
  • ivars の先頭の中括弧で宣言できるようになりました。 @implementation :

ということです。

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