티스토리 뷰

IOS

@Property, @Synthesize, @Dynamic

Vincent.seo 2017. 3. 29. 15:12

@property : accessor 메소드를 선언하는 간편한 방법 제공

@synthesize : 컴파일러가 지정된 accessor 메소드를 자동으로 작성하게 만든다.
프로퍼티 이름과 그 프로퍼티를 나타내는 인스턴스 변수 이름을 달리하기.
@synthesize propertyName = instance variableName;

@dynamic : accessor를 직접 작성할 것임을 컴파일러에 알리기 위하여 사용, 즉 getter 와 setter가 구현되어 있지 않아도 상위 클래스 어딘가에서 선언되어 있다고 미리 알려주기 때문에 컴파일 할 때 오류가 발생하지 않는다.
주로 setter 에 입력값을 제한하는 로직이 들어있을때, 이것을 사용한다.

프로퍼티속성에는 3가지가 있다.

1. getter 와 setter의 이름을 변경하거나 사용여부를 선택하는 속성
@property (nonatomic, getter = isCaffeinated) BOOL caffeinated;

2. 프로퍼티 접근을 어떻게 관리할 것인지에 대한 속성
readwrite
프로퍼티에 접근하는 권한을 설정하는 속성으로 getter와 setter를 다 사용할수 있게 한다.

readonly
getter 만 사용할 수 있게 권한을 설정 한다.
공개적으로 readonly속성으로 선언된 프로퍼티를 위해(내부용으로) 숨겨진 setter을 만들어 사용할 수있다.

이럴때는 클래스의  .m 파일에 확장 영역에서 readonly 프로퍼티를 다시 선언하면 된다.

아래 부분을 @implementation 위에 추가한다.

@interface Employee()

@property (nonatomic, readwrite) int employeeNumber;

@end

이렇게 되면 setEmplyeeNumber:는 implementation파일 내부에서만 보인다.




3. 프로퍼티의 접근 방법

retain

카비지 컬렉션을 사용하는 경우 retain은 assign과 동일한 의미를 같게 된다.

즉 레퍼런스 카운팅과 가비지 컬렉션을 모두 사용해야만 하는 프레임워크 코드를 작성하지 않으면 retain을 사용할 필요가 없다.

- (void) setSupervisor:(Employee*) newSupervisor

{

[newSupervisor retain];

[supervisor release];

supervisor = newSupervisor;

}


assign(디폴트)

setter는 단순히 새로운 값을 프로퍼티에 저장한다.

assign속성은 비(非)오프젝트 프로퍼티로 사용할수 있는 단 하나의 속성이다.

- (void) setCount:int newCount

{

count = newCount;

}


copy

인서턴스 값을 그대로 복사해서 다른 메모리를 생성하여 따로 저장.

- (void) setName:(NSString*) newName

{

NSString *tmp = name;

name = [newName copyWithZone: nil];

[tmp release]

}


4. 선언의 멀티스레드 지원 여부를 설정하는 속성

atomic키워드는 없다. nonatomic속성을 사용하지 않는다면 자동으로 기본 속성 atomic으로 프로퍼티가 설정된다.

nonatomic


5. ARC가 도입되면서 추가된 프로퍼티 속성.

strong

strong은 retain과 비슷한 키워드로, strong 참조로 지정된 변수에 새로운 객체를 대입하면 해당 객체는 무조건 retain 됩니다. 차이점은 컴파일시 dealloc 메소드에 해당 변수를 해제하도록 release 코드가 자동으로 추가 된다는 점입니다.

대부분의 객체 변수에는 참조를 계속 보존해야 함으로 nonatomic과 strong이 사용된다. Deletage 활용시 주로 weak이 사용된다.


weak

weak는 weak 선언된 프로퍼티가 가리키고 있는 객체가 메모리에서 해제될 때 자동으로 nil 값을 대입해 줌으로써 초기화됩니다.

객체를 생성한 뒤, 참조 보존을 할 필요가 없을때 사용.

int, float 혹은 일반 UI 컨트롤 객체 생성 시 사용함.


'IOS' 카테고리의 다른 글

레이아웃 - 스크롤뷰의 컨텐츠 추가 삭제 하기  (0) 2018.08.28
IOS 스레드 제어  (0) 2018.08.28
PDF 파일 생성 및 저장(UIView를 이용)  (1) 2018.03.29
Property  (0) 2018.03.14
클래스 오브젝트 초기화  (0) 2017.03.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함