일반적으로 우리는
@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 파일에 선언 된 클래스에서 상속되지만 약간 다른 동작을 갖는 다른 작은 클래스가 있습니다. 이것을 공장 패턴으로 사용할 수 있습니다.