@interface MyClass : ParentClass {
int param1;
NSString* param2;
}
@property(assign,readwrite,nonatomic) int param1;
@property(retain,atomic) NSString* param2;
위와 같이 두개의 property를 이용해서 클래스 멤버에 대한 접근자를 자동으로 생성해주게 되는데, 몇가지 옵션에 따라서 접근자의 성격이 달라지게 된다.
멤버가 값 타입인 경우에는 옵션으로 assign을 설정하거나 지정하지 않으면 된다.
멤버가 객체타입인 경우에는 assign, retain, copy 중 하나를 옵션으로 지정하여야 한다.
옵션에 따라 자동으로 생성되어지는 setter 접근자는 다음과 같이 차이가 있다.
>> assign으로 한 경우 ( 생략한 경우는 기본으로 assign으로 인식함 )
- (void) setParam:(TYPE)obj {
param1 = obj; // 단순히 값을 대입하기만 한다.
}
즉, 넘겨받은 값을 변수에 대입하는 형태로 setter를 자동으로 만들게 된다.
>> retain으로 한 경우
- (void) setParam:(TYPE)obj {
if ( param != obj ) {
[param release]; // 기존 객체를 해제하고,
param = [obj retain]; // 넘겨받은 객체의 레퍼런스카운트 증가해서 할당한다.
}
}
즉, 원래 저장되어 있던 값의 객체의 레퍼런스 카운트를 하나 감소시켜 해제를 시키고, 넘겨받은 객체의 레퍼런스카운트를 증가시킨 상태로 변수에 저장을 하는 것이다.
>> copy로 한 경우
- (void) setParam:(TYPE)obj {
if ( param != obj ) {
[param release]; // 기존 객체를 해제하고,
param = [obj copy]; // 넘겨받은 객체의 사본을 만들어 할당한다.
}
}
이 경우는 가지고 있던 값을 해제시키는 것은 retain과 같고, 넘겨받은 객체는 건드리지 않고, 복사본을 만들어(만듬과 동시에 복사된 객체의 레퍼런스카운트는 증가됨) 변수에 저장하는 것이다.
위와 같은 이유로 값타입인 경우에는 assign만 의미가 있고, 객체 타입인 경우에는 assign, retain, copy 세가지가 될 수가 있다.
---------------
atomic과 nonatomic이란 옵션은 만약 앱이 다중스레드 환경이라면 해당 변수에 접근하는데 있어서 데드락 같은 문제가 발생할 수가 있다. 즉, 변수에 접근할 때 락을 걸어서 동시에 접근을 못하게 보장하려면 atomic으로 해야 한다. 만약, 이러한 문제에 전혀 걱정이 없다면 nonatomic으로 지정을 하면 된다. 아무 지정도 하지 않으면 atomic이 기본값이 된다.
-----------------
위와 같이 property와 synthesize를 이용하면 자동으로 getter와 setter를 생성해주게 되는데, readonly를 지정해주게 되면 읽기 전용이 되어서 setter는 생성해주지 않게 된다. 아무 지정을 해주지 않게 되면 기본값으로 readwrite로 되어서 getter, setter를 두개 생성해주게 된다.
( 단지, 접근자의 생성에 대한 문제이며, 멤버변수에 다이렉트로 접근하는것에 대해 제한하는 것은 아니다. )
---------------
getter와 setter가 자동으로 생성될 때는 만약 이름이 param 이었다면 getter로는 param, setter로는 setParam 으로 명명이 된다. 만약, 직접 이름을 지정해주고자 할 때는 getter와 setter를 다음과 같이 지정해주면 된다.
@property(setter=setValue:) int myValue;
'프로그래밍 > iOS' 카테고리의 다른 글
위치정보(GPS) (0) | 2011.06.03 |
---|---|
뷰 Animation효과 - 모달창 띄우기 / 창뒤짚이는효과 / 페이지넘김효과 (0) | 2011.06.03 |
iOS 메모리 관리 (0) | 2011.06.02 |
MPMoviePlayerController의 Notifications목록 (0) | 2011.06.02 |
UIView 화면 터치시 single tap , double tap에 대한 구현 (0) | 2011.06.02 |