2013-03-04 3 views
5

개인 인스턴스 변수를 선언해야하는 위치와 규칙에 대한 규칙/규칙/환경 설정/diktat는 무엇입니까?Objective-C에서 개인을 숨길 곳

// someClass.h 

@interface someClass : NSObject { 
@private 
// Here in the class declaration? 
} 
// ... 
@end 

// someClass.m 

@interface someClass() { 
// Here in the class extension? This seems to be obj-c's version 
// of the C++ Pimpl idiom. 
} 
@end 

@implementation someClass { 
// Here in the class definition? BTW, what's the default scope here? 
// Seems like it should be @private. I haven't been able to find much 
// documentation about this declaration block. 
} 
// ... 
@end 

이에 좋은 웹 자원에 대한 세 가지 섹션이나 지점의 적절한 사용에 대한 사람들의 의견을 수 있습니까? 감사!

+6

+1입니다. – IronMan84

+0

제목은 조금 건방지 만 질문에 대해서는 진지합니다. 이 주제에 대한 철저한 문서를 찾을 수 없었습니다. 내가 책 (Kochan, Sadun, Ali)과 Apple doc에서 본 것은 아무것도 그것에 대해 철저하고 포괄적 인 토론을 제공합니다. – Phil

+2

'@ implementation' 블록에있는 ivars의 기본 범위는'@ private'입니다. 그러나 동일한 .m 파일에 여러 클래스를 넣지 않는 한 다른 클래스는 액세스 할 수있는 필수 조건 인 ivars를 볼 수 없습니다. –

답변

4

오늘은 @implementation 또는 (비공개) 클래스 확장에 넣는 것이 좋습니다.

Ivars는 클래스의 클라이언트에게는 중요하지 않으므로 공용 API (헤더)에 표시하면 안됩니다.

@implementation 또는 클래스 확장에 퍼팅하는 데 별다른 차이가 없습니다. 일관성을 위해 항상 @implementation에 넣었습니다.

+0

나는 항상 클래스 확장에 넣었다. – vikingosegundo

+0

다음과 같은 질문을 할 수 있습니다. 인스턴스 변수를 하위 클래스에 노출하려는 클래스에 대해 당신이 주장하는 것은 무엇입니까? 개인적으로 필자는 적절한 getter를 가진 카테고리를 선호하는 경향이 있으며 주요 'public'헤더보다 다른 곳에서 선언 될 수 있습니다. – Tommy

+0

@ 토미 나는 이것이 캡슐화를 깨뜨린다고 생각한다. 다른 클래스 (하위 클래스 또는 하위 클래스)는 ivars에 액세스하지 않아야합니다. –