[objective-c] .h 및 .m 파일의 @interface 정의 차이점

일반적으로 우리는

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

.h 파일과 .m 파일의 메서드는 .h 파일에 선언 된 변수의 속성을 합성합니다.

그러나 일부 코드에서는이 @interface ….. @ end 메서드가 .m 파일에도 유지됩니다. 무슨 뜻이에요? 그들 사이의 차이점은 무엇입니까?

또한 .m 파일에 정의 된 인터페이스 파일의 getter 및 setter에 대한 몇 가지 단어를 제공하십시오.

미리 감사드립니다



답변

@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

‘private category'(이름없는 카테고리의 적절한 이름은 ‘private category’가 아니라 ‘class extension’) .m은 컴파일러가 메서드가 정의되었다는 경고를 방지합니다. 그러나 @interface.m 파일의는 범주 이기 때문에 ivars를 정의 할 수 없습니다.

업데이트 6th Aug ’12 : Objective-C는이 답변이 작성된 이후로 발전했습니다.

  • ivars 클래스 확장에서 선언 될 수 있습니다 (항상 가능-대답이 잘못됨)
  • @synthesize 필요하지 않습니다
  • ivars이제 상단의 중괄호로 선언 할 수 있습니다 @implementation.

그건,

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


답변

개념은 .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


답변

.m 파일에 다른 클래스를 만들 수도 있습니다. 예를 들어 .h 파일에 선언 된 클래스에서 상속되지만 약간 다른 동작을 갖는 다른 작은 클래스가 있습니다. 이것을 공장 패턴으로 사용할 수 있습니다.


답변