2011-07-01 2 views
3

나는 약간 혼란 스럽다. 객체가 .h 파일에서 선언되면 자동으로 "공용"으로 간주됩니까? 그러나 .h 파일에서 @property을 사용하여 편집합니다. 이것이 내가 이해할 수없는 부분입니다. 개인용 객체에 getter/setter를 사용합니다. 따라서 .h 파일에 선언되어 "public"으로 간주되는 객체에 @property을 사용하는 이유는 무엇입니까? 우리가이 코드에 primaryKey에 대한 @synthesize를 사용하는 이유 이해가 안 :공공 물건과 재산의 사용

두 번째 것은,이 예제를 발견 http://staging.icodeblog.com/wp-content/uploads/2008/08/9-todom1.png 을 왜 우리는 database 개체에 대한 @property를 사용하지 않는?

답변

3

개체 (ivar)가 .h 파일에서 선언 된 경우 올바르지 않습니다. getter/setter 메소드가 제공되는 경우에만, 그렇지 않으면 그렇지 않습니다.

실제로, @property/@synthesize 지시어는 기본 getter/setter 메소드를 선언하고 정의하기위한 기능입니다. 따라서 직접 작성하는 대신 지시문을 사용하십시오.

속성을 선언하면 점 표기법을 사용하여 개체의 속성을 참조 할 가능성이 있습니다. 또한 retain/assign/copy 지정자와 해당 속성에 대해 메모리를 관리하는 방법에 대해 자세히 설명합니다. (그리고, 물론, @synthesize는 당신을 위해 그것을 정확하게 할 것입니다).

견본에 대해서는 실제로 ivar이 속성과 연결되어 있는지 여부가 디자인 선택 사항입니다. 아마도 .h 파일에서 선언 된 ivars가 기본값에 의해 공개되고 더 명확해질 것이라는 가정을 재검토하면됩니다. 즉, primaryKey은 공개이므로 database은 공개되지 않습니다.

아주 좋은 튜토리얼은 here이며, Apple docs도 잊지 마세요.

편집 : 코멘트 섹션에서 귀하의 질문에 대한

:

는 모든 아이바는 속성이 없으며, 순서대로 게터/세터을 가지고 그 클래스 구현의 내부에 사용되는 필요는 없다

.

@interface SomeClass : NSObject { 
    AnotherClass* _anotherClassObj; 
    AThirdClass* _aThirdClassObj; 
} 
@property (nonatomic, retain) AnotherClass* anotherClassObj; 
@end 

그래서 여기에 두 개의 ivars가 있습니다. 하나만 @property 선언을 받았습니다. .m 파일에는 예를 들어이 코드에서

@implementation SomeClass; 
@synthesize anotherClassObj = _anotherClassObj; 

- (void)initWithClasses:(AnotherClass*)obj1 and:(AThirdClass*)obj2 { 
    ..... 
    self.anotherClassObj = obj1; 
    _aThirdClassObj = obj2; 
    ... 
} 

.... 
@end 

:

  1. @synthesizeanotherClassObj 그래서 당신이 구문을 사용할 수 있습니다에 대한 게터/세터에 대한 구현을 제공합니다 : self.anotherClassObj = obj1을; 그 구문은 클래스 구현의 내부와 외부에서 똑같이 사용할 수 있습니다.

  2. 단순 포인터 복사의 의미로 _aThirdClassObj = obj2; 구문을 사용하여 ivar에 직접 할당 할 수있는 getter/setter (자동 생성 또는 사용자 지정)가 없을 때; 어쨌든 _aThirdClassObj은 해당 클래스 외부에서 액세스 할 수 없습니다. 혹시 필요하면

  3. 또한, @property ... anotherClassObj에도 불구하고, 여전히, 게터/세터를 우회, _anotherClassObj = xxx에서처럼, 당신의하는 .m 파일에 직접 _anotherClassObj을 참조 할 수 있습니다.

getter/setter가 ivar를 "public"으로 만드는 방법 일뿐만 아니라 분명히해야 할 것이 하나 있습니다. 또한 보유 수를 관리하는 데 중요한 역할을합니다 (속성 선언에서 보유/할당/복사 중에서 선택하는 지정자에 따라 다름). 따라서 위의 self.anotherClassObj = obj1;에서 obj1_anotherClassObj에 할당되며이 값도 그대로 유지됩니다. 이전에 _anotherClassObj이 개체를 가리킨 경우 해당 개체는 release으로 전송됩니다. 원시 ivar 지정은 그런 종류의 기능을 제공하지 않습니다.

제 생각에 속성 보유 여부 관리 기능은 속성 사용 여부 결정에 대한 가시성보다 훨씬 중요합니다.

+0

감사 세르지오, @package, @private, @public 참조
Declared Properties     @property 참조, 그래서 모든 바르를 @protected .m 파일에서 사용하고 속성 뒤에 "="기호를 넣으려면 속성이 있어야합니다 (즉 setter를 사용한다는 의미입니까?). 또는 ivars가 재산을 인수하지 않고 물건을 합성하는 코드를 찾을 수 있습니까? – Paul

+0

@ Paul # 2. [this] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17)을 읽어보십시오. –

+0

@sergio : 감사합니다. sergio for the edit! 좋아, 이것은 AnotherClass * _anotherClassObj와 같은 "객체"를위한 것이지만 정수 나 다른 프리미티브에 대한 "속성"을 결코 보지 못할 것입니다. 그리고, 물건을 제외하고는 "재산"을 사용하지 않는 물건을 보는 것이 일반적입니까? 고마워요. – Paul

2

헤더의 모든 항목이 공개되지는 않지만 기본적으로 ivars ({}의 항목)는 @protected입니다. @property의 목적은 데이터 캡슐화입니다. @synthesize 또는 @dynamic은 속성을 구현하려는 방식을 선언하는 데 사용되고 충돌 또는 경고를 방지하기 위해 하나 또는 다른 속성이 필요합니다.

자료 :
Defining Classes               .H 파일에

관련 문제