Programming/Mac & iOS

[iOS] @property, @synthesize, @dynamic

MB Brad KWON 2016. 4. 19. 15:40

@property


    클래스 내의 멤버 변수에 대하여 접근자를 생성한다. @property를 사용할 경우, 추가로 attribute를 부여할 수 있다. attribute들은 아래와 같다. '*'로 표시된 attribute는 선언하지 않아도 기본적으로 적용되는 attribute들이다.


getter= : 접근자 중 getter의 메소드 이름을 정의한다.


setter= : 접근자 중 setter의 메소드 이름을 정의한다.


readwrite *  : getter/setter를 모두 만든다. Mutually exclusive로 readwrite를 한다.


readonly : 오직 getter만 생성한다. 해당 property에 값을 할당하려고 하면 컴파일 오류가 발생한다.


assign * : setter를 통해 간단한 할당만 할 뿐 reference count를 증가 시키지 않는다.


retain : 외부에서 해제된 객체의 참조 문제를 막기 위해 reference count를 증가시킨다.


copy : 할당하는데 있어, 객체의 복사본을 사용한다. copy를 이용하려면 NSCopying 프로토콜을 구현한 객체여야 한다.


nonatomic : 멀티 프로세서 환경에서 Mutual exclusive lock으로 접근자를 보호하지 말라고 지시하는 것이다. 기본적으로 nonatomic을 선언하지 않으면 atomic으로 동작한다.



@synthesize


    @property를 사용할 경우, getter/setter를 @impementation에 구현해야 한다. @synthesize는 사용하여 작성해주는데, modern objective-C에서는 @synthesize를 작성할 필요 없이 접근자를 자동으로 생성해준다.



@dynamic


    @synthesize를 대신하여 사용할 수 있는 지시어로, getter/setter를 자신의 클래스가 아닌 다른 곳에 구현되어 있음을 알려주는 지시어이다. 이 지시어를 사용할 경우, getter/setter가 구현되어 있지 않을 경우라도 컴파일러 경고를 받지 않는다.