Objective-C @property 의 설정자
이번 포스팅은 Objective-C의 @property 선언시 사용되는 설정자에 대한 정리이다.
@property는 클래스의 속성이나 설정이라고 이해를 하면 된다. 최근 들어 인스턴스 변수, 메서드 @property로 다 선언해서 사용하고 있다.
public으로 노출해야할 경우 .h파일의 @interface에서 선언하는데 객체지향에서는 별로 좋은 방법은 아니고 setter, getter를 두고 관리하는게 더 좋을 수 있다.
최근 프로젝트에서 public property를 선언해서 사용해본적은 없다.
대부분 @implementation 상단에 private형태의 객체선언으로 대신해서 사용한다.
@property로 속성을 설정할 때 사용할 수 있는 설정자들이 있는데 사실, 아직 온전히 이해하지는 못했다.
알고 보면 다 아 ~ 하는 내용이겠지만 여튼, 몇가지 설정자에 대한 이야기를 해본다.
일단 @property (설정자, nonatomic) 타입, 속성명으로 정의가 가능하다.
@property(weak, nonatomic) NSString *myName;
이렇게 선언된 property는 실제 사용할때는 클래스.myName = @"younghu.min"; 또는 NSLog(@"myname = %@", [클래스 myName]); 과 같은 형태로 사용하면 되는 setter와 getter의 의미로 사용하면 된다.
메서드 형태로도 구현이 가능한데
- (void) setMyName:(NSString *)name {
self.myName = name;
}
- (NSString *)myName {
return self.myName;
}
이런 방식으로 구현하면 된다. 스마트폰 어플은 리소스 제약이 많으므로 Objective-c프로그래밍시LazyLoading이라고 해서 게으른 로딩 기법을 많이 사용한다.
객체가 필요할 때 로딩해서 사용하는 방식인데 작은 단말에서 사용하기는 괜찮은 방식이다. ^^
<property 선언 예시>
이야기가 좀 빗나갔다.
property 선언시 사용하는 설정자는 ReadWrite, ReadOnly, assign, retain, copy, nonatomic 등이 많이 사용된다. getter, setter는 이미 설명했다.
이 중, 프로퍼티의 값을 유지하는 방법에 대한 설정자는 assign, retain, strong, weak, copy등이 있다.
retain, strong, weak, copy는 Objective-C 클래스의 인스턴스를 프로퍼티로 사용할 때 지정한다.
@property (retain, nonatomic) MyClass *myClass; 와 같은 형태인데 소유권을 가져올 때 retain count를 증가시켜 사용하는 객체가 소유권을 가질 때 retain, strong, copy등을 사용한다.
Objective-C의 메모리 관리기법에 대한 사전 지식이 있다면 이해가 쉬울 수 있는데 좀 어렵고 까다로운 이야기이다.
다음에 Objective-C의 메모리 관리 기법에 대한 자료를 찾아서 정리를 해바야겠다.
여튼, assign의 경우 프로퍼티의 값을 단순히 '=' 연산자로 대입하는 경우가 되고 객체보단 변수(int, long, bool)등에 값을 셋팅할 때 사용한다.
copy는 사실 사용해본적이 없다. 그만큼 프로그래밍의 깊이 낮다. ㅋㅋㅋ
ARC모드가 지원되면서 객체나 프로퍼티의 메모리 관리에 대한 개념이 상당부분 없어진 것이 사실이다. ARC가 지원되지 않는 곳에서 Analyze를 해보면 leak이 엄청 많이 나오는 걸 알 수 있었다.
nonatomic의 경우는 스레드간에 동기화를 하지 않음을 뜻하고, 지정하지 않으면 스레드 사이에서 항상 동기 처리를 한다고 정의 되어 있다. 딱 한번 예시를 본 것 같은데 기억이 잘 안난다. ㅎㅎ
'프로그래밍 > Xcode-iOS' 카테고리의 다른 글
Objective-C 블록구문 (0) | 2017.11.03 |
---|---|
.png pngcrush caught libpng error 해결 방법 (0) | 2017.11.02 |
Objective-C 카테고리 정의 (0) | 2017.11.01 |
Objective-C 프로토콜 정의 (0) | 2017.11.01 |
objective-C 디버깅 팁, po와 print (0) | 2017.11.01 |