본문 바로가기

프로그래밍/iOS

[ios] @property

ios에선 따로 getter/setter 쓸 필요 없이

.h파일에서

@property 변수명;

.m파일 @implementation아래에

@synthesize 변수명;

해주면 자동으로

//getter

-(변수 타입) 변수명 

{

   return 변수;

}

//setter

-(void) set변수명:(변수타입)a 

{

   변수명=a;

}

위와 같은 getter/setter가 만들어 진다.

 

위 내용은 알겠는데 

@property (nonatomic, retain) UIImage* img; 
@property (nonatomic, copy) NSString* name; 
@property (nonatomic, assign) BOOL enable;

위와 같이 nonatomic, atomic retain, copy, assign의 내용을 모르겠어서 포스팅

 

- nonatomic/atomic

다중 쓰레드에 대해서 고려할지 말지를 결정

여러 쓰레드가 경쟁적으로 접근하는 프로퍼티라면 atomic사용

그럴 필요 없다면 nonatomic으로 사용


-retain/copy/assign

retain 

@property(nonatomic, retain) NSInteger* number;

라고 선언되있다고 가정하자

retain으로 설정 시 컴파일러는 setter를 생성할 때 다음과 같이 만든다.


-(void) setNumber:(NSInteger*)n

{

   if(number!=n)

   {

      [number release];

      number=[n retain];

   }

}

빨간 부분이 주목할 곳이다. 

새로운 객체를 set해줄 시 기존 객체를 release해준 뒤 

새로운 객체에 retain을 한번 호출해준다.

이는 외부에서 그 객체를 release하더라도 객체가 메모리 해제되지 않도록 유지해준다.


copy

@property(nonatomic, copy) nNSInteger* number;

라고 선언되있다고 가정하자

copy로 설정 시 컴파일러는 setter를 생성할 때 다음과 같이 만든다.

-(void) setNumber:(NSInteger*)n

{

   if(number!=n)

   {

      [number release];

      number=[n copy];

   }

}

copy의 경우 설정하려는 개체의 값을 복사해서 자신이 가지고 있도록 한다.

copy자체가 retain을 한번 호출하기 때문에 따로 retain을 추가로 호출하지 않음.

copy는 값을 복사해 새로운 객체를 만든다.

이로 인해 인자로 전달되는 객체가 자주 변경될 경우 사용하면 좋다.


assign

@property(nonatomic, assign) nNSInteger* number;

라고 선언되있다고 가정하자

assign으로 설정 시 컴파일러는 setter를 생성할 때 다음과 같이 만든다.

-(void) setNumber:(NSInteger*)n

{

   number=n;

}

assign은 가장 단순한 방법으로 그냥 값을 대입한다.

이렇게 설정할 경우 외부에서 참조 카운트를 감소시켜 객체가 해제될 위험이 있다.

따라서 이 값은 객체가 아닌 BOOL, int등의 일반값에 대해 적합하다.


-retain, copy등을 사용할 때 메모리 해제

copy와 retain둘 다 retain을 호출한다.

이에 참조 카운터를 증가시킨다.

따라서 dealloc함수에서 release를 해주어야 한다.

-(void)dealloc

{

   [number release];

   [super dealloc];

}

내용출처 : http://maclove.pe.kr/28