'맥프로그래밍'에 해당되는 글 9건

  1. 2009.06.06 Objective-C : Property
반응형
1. Value-Property
Objective-C에서는 instant variable에 대한 accessor를 자동으로 설정해주는 property 가 존재한다. 예를 들어 다음 코드를 보자

testObject는 in_variable1,2에 대한 accessor들이 정의되어있고 구현 되어 있다. accessor 정의를 다음과 같이 @property 키워드를 이용하여 간략화 할수 있다.

뿐만 아니라 구현에서도 @synthesize 키워드를 이용하여 @property 로 정의된 attribute에 대하여 accessor를 자동적으로 생성 가능하다. 다음은 이를 이용한 코드 이다.

accessor는 dot notation으로 사용이 가능하다. 즉 main은 다음과 같이 변경 가능하다.


%% 이는 Objective-C 2.0 의 특징으로 Mac OSX 10.5(leopard) 이상에서만 사용 가능하다.그리고 iphone 개발에서도 많이 사용 된다.

2. Object-Property
Object는 value의 property에 비해서 accessor 가 조금 복잡하다.









testObject는 NSString 객체와 referObject 객제를 가진다.

이 두 객체에 대한 accessor로 setName, name, setRefObj, refobj 메소드 들이 있으며



setName은 새로 입력 받는 NSString을 Copy 하고 있으며


setRefObj는 retain/release 하고 새로운 object를 설정한다. (앞의 Memory Management 참고)

(NSString 을 Copy 하는 것은 UI에서 특정 String을 받는 것과 관련이 있다. Copy하지 않고 Reference를 가지고 있는 경우에 해당 객체가 아닌 다른 곳에서의 변경이 영향을 받을 수 있다.)






이 코드는 다음과 같이 @property와 @synthesize를 이용하여 코드를 줄일 수 있다.

@property 다음이 copy 옵션을 주어서 해당 객체에 대해서 copy가 되도록 하고 retain 옵션으로 retain/release가 적용 되도록 하였다. 만약 아무것도 주지 않으면 compiler는 assign 을 default로 가져 간다. (value의 경우처럼)

% 다른 옵션으로 nonatomic이 있다. 이는 multithreaded 환경이 아닌 경우 accessor 를 좀더 빠르게 빠르게 해준다. desktop 에서는 성능이 워낙 빠르기 때문에 효과가 없으나 resource-constrained 디바이스 즉 iphone의 경우에는 성능 향상을 위해서 자주 사용한다.

3. Read-Only
@property 는 기본적으로 readwrite 상태를 설정한다. 이전에 name에 대한 accessor는 다음과 같은 형태이다.

@property (readwrite, assign) in_variable1;

만약 read-only로 설정하고 싶으면 다음과 같이 하면 된다.

@property (readonly) float Pi;

이럴 경우 getter는 생성하지만 setter는 생성하지 않는다.

4. accessor to another object name
@property -> @synthesize 하게 되면 관련 기본적으로 같은 이름의 instance variable에 대해서 accessor가 생성되지만 어떨 경우에는 accessor 이 이름과 instance variable의 이름이 다른 경우가 있다. 이럴 경우 synthesize 에 instance variable을 지정함으로 property 와 instance variable을 연결할수 있다.
다음의 예를 보자




Property를 name으로 설정하고

synthesize 명령에 name=appelation 을 넣음으로 name property는 appelation 변수를 가르킨다라는 것을 알려줌

하지만 init 메소드에서 name으로 접근하면 선언 되지 않았음으로 에러가 남


마찮가지로 dealloc에서도 name으로 release할수 없음











이 경우 init 에서는 self.name=@"Init Name"으로 하면 에러가 없어진다. [self setName:@"Init Name"] 과 같은 효과, 그리고 delloac에서는 self.name=nil; 코드로 변경함으로 해당 객체를 clean-up 할수 있다. [self setName: nil] 과 같은 효과임 (nil retain -> name release -> name=nil)
반응형
Posted by alias
,