2011-05-13 4 views
4

저는 합리적으로 야심 찬 첫 번째 iPhone 프로젝트를 개발하는 데 상당히 어려움을 겪었습니다. 속성을 구현하고 액세스하는 방법과 이유에 대해 혼란 스럽습니다. 실시 예 1Xcode 4 및 iOS 4의 멤버 및 속성 정의

(.H)에

@synthesize sale = _sale; 

예 2 (하는 .m)에

Nsstring *_sale; 
@property (nonatomic, retain) NSString *sale; 

:

@property (nonatomic, retain) NSString *sale; 
합니다 (.H에서)

(.m)

@synthesize sale; 

이 두 가지 모두 문제없이 작동하는 것처럼 보이지만이 작업을 수행하는 데 두 가지 이유가 있으며 왜 어떤 이점이 있는지를 파악하려고합니다.

누군가가 저에게 차이점을 말해 줄 수 있습니까?

+0

그것은 .. setter 및 getter를 통해 ivar에 액세스하려는 경우 (예를 들어 _name을 사용하여 명시 적으로 표시하는 경우) 예 1과 같이 수행 할 수 있지만 일반적으로 예제 2에서와 같이 수행 할 수 있습니다. –

답변

4

예 1은 ivar/속성 변수 쌍을 정의하는 오래된 방법을 보여줍니다. 이제 새로운 컴파일러가 당신을 위해 ivars (NSstring *_sale; 부분)를 생성합니다. 예 1은 또한 수동으로 문을 사용하여 sale 속성과 _sale 쌍을 페어링하는 방법을 보여줍니다.

예제 2는 Obj-C에서 속성을 구현하는보다 간결한 방법이며 인터넷에서 대부분의 예제 코드를 볼 수있는 방법입니다. 컴파일러가 생성 한 액세서/뮤 테이타 메소드를 덮어 쓰지 않고도 속성을 작성할 수 있습니다.

명확성을 위해 인스턴스 변수를 나타내는 밑줄 접두사의 일부 단단한 지지자가 있습니다. 예 1에서와 같이 self.sale을 autoreleased NSString과 동일하게 설정하면 메모리 관리와 관련하여 도움이된다는 것을 알 수 있습니다. 그러나 자동 채워진 객체와 동일한 _sale을 설정하면 나중에 비정상적인 동작이 발생합니다. 전달 된 NSString이 인스턴스 변수에 의해 유지되지 않기 때문입니다. 당신이 예에 표시된대로 일반적으로

, 내 성질을 작성 선호 2.

짧은 대답 :이 새로운 컴파일러는 지금 당신을 위해 몇 가지 물건을 추론 할 수 있기 때문에이 일을 두 가지 방법이 있지만 이전 방식과의 호환성은 이전 버전과의 호환성을 위해 남겨졌습니다.

+0

@ Mr-sk : Xcode 4는 2010 년까지 발표되지 않았으며 2009 년부터 문제의 코드에 대한 문서화 된 사용 (http://bill.dudney.net/roller/objc/entry/ivars_vs_properties)이 있습니다. – FreeAsInBeer

+0

특히 메모리 관리 관점에서 감사합니다. PHP, Java 및 C#에서 왔습니다. 메모리 관리는 재미 있고 익숙하지 않은 과학입니다 –

+0

Xcode 4.5는 접두사가 밑줄이있는 ivars를 자동 합성합니다. – LearnCocos2D