개체 (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
:
@synthesize
anotherClassObj
그래서 당신이 구문을 사용할 수 있습니다에 대한 게터/세터에 대한 구현을 제공합니다 : self.anotherClassObj = obj1
을; 그 구문은 클래스 구현의 내부와 외부에서 똑같이 사용할 수 있습니다.
단순 포인터 복사의 의미로 _aThirdClassObj = obj2;
구문을 사용하여 ivar에 직접 할당 할 수있는 getter/setter (자동 생성 또는 사용자 지정)가 없을 때; 어쨌든 _aThirdClassObj
은 해당 클래스 외부에서 액세스 할 수 없습니다. 혹시 필요하면
또한, @property ... anotherClassObj
에도 불구하고, 여전히, 게터/세터를 우회, _anotherClassObj = xxx
에서처럼, 당신의하는 .m 파일에 직접 _anotherClassObj
을 참조 할 수 있습니다.
getter/setter가 ivar를 "public"으로 만드는 방법 일뿐만 아니라 분명히해야 할 것이 하나 있습니다. 또한 보유 수를 관리하는 데 중요한 역할을합니다 (속성 선언에서 보유/할당/복사 중에서 선택하는 지정자에 따라 다름). 따라서 위의 self.anotherClassObj = obj1;
에서 obj1
은 _anotherClassObj
에 할당되며이 값도 그대로 유지됩니다. 이전에 _anotherClassObj
이 개체를 가리킨 경우 해당 개체는 release
으로 전송됩니다. 원시 ivar 지정은 그런 종류의 기능을 제공하지 않습니다.
제 생각에 속성 보유 여부 관리 기능은 속성 사용 여부 결정에 대한 가시성보다 훨씬 중요합니다.
감사 세르지오, @package, @private, @public 참조
Declared Properties @property 참조, 그래서 모든 바르를 @protected .m 파일에서 사용하고 속성 뒤에 "="기호를 넣으려면 속성이 있어야합니다 (즉 setter를 사용한다는 의미입니까?). 또는 ivars가 재산을 인수하지 않고 물건을 합성하는 코드를 찾을 수 있습니까? – Paul
@ Paul # 2. [this] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17)을 읽어보십시오. –
@sergio : 감사합니다. sergio for the edit! 좋아, 이것은 AnotherClass * _anotherClassObj와 같은 "객체"를위한 것이지만 정수 나 다른 프리미티브에 대한 "속성"을 결코 보지 못할 것입니다. 그리고, 물건을 제외하고는 "재산"을 사용하지 않는 물건을 보는 것이 일반적입니까? 고마워요. – Paul