.h 및 .m 파일의 @interface 정의 차이점


81

일반적으로 우리는

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

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

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

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

미리 감사드립니다

답변:


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

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

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

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

그건,

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

4
작은 참고, 비공개 인터페이스를 선언 할 때 실제로 괄호 안에 아무것도 넣지 마십시오. 그렇지 않으면 카테고리가 생성되고 원하지 않습니다. @interface Person ()충분합니다.
Itai Ferber

감사합니다 itaiferber, 나는 그것을 눈치 채지 못했습니다. 내 답변을 업데이트했습니다.
Benedict Cohen

4
사람들이 카테고리에 대해 더 많이 알고 싶다면 ..이 페이지 는 나에게 매우 유용했습니다.
Tim

1
괄호에 아무것도 경우,이 사실이라고 class extension하지 않은category
Paul.s

5
@ giant91이 답변은 상당히 오래되었으며 처음 작성된 이후 컴파일러가 크게 향상되었습니다. 메서드 본문이 '표시'인 경우 컴파일러는 더 이상 메서드에 대한 선언이 필요하지 않습니다. 즉, 클래스 연속 ( @interface className ())은 이제 일반적으로 private 만 포함합니다 @property.
Benedict Cohen

10

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

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.