2010. 10. 2. 23:09
먼저 이 글은 모두 Head First iPhone Development 책을 읽고 내게 필요한 부분, 중요한 부분, 느낀점등을 잊지 않기위해, 나중에 글쓴이가 봤을 때 왜 이렇게 했었는지 등을 다시 한번 확인하기 위해 작성한것임을 밝힙니다.

아이폰에서 Objective-C 는 가비지 콜렉션을 지원하지 않는다.(물론 Mac에서는 지원한다) 그래서 레퍼런스 카운팅 (Reference Counting) 을 사용한다.
기본적으로 각 객체는 자신을 참조하는 객체들의 수를 기억하고 있다가, 참조수가 0이 되면 (자신을 참조하는 객체가 없는 경우) 메모리에서 제거한다. 프로퍼티를 사용 할 경우, 컴파일러가 이런 메모리 관리 기능을 처리한다. 

다음은 몇몇 프로퍼티 속성관련 메모리처리 방법이다.

readonly : getter 만 생성한다.

- (NSString*) myField {  //  getter 생성
return myField;
}

retain : getter 와 setter 둘 다 생성하며, 새로운 객체를 retain 하고, 기존의 객체를 release 한다.

- (NSString*) myField {  //  getter 생성
return myField;
}
- (void) setMyField: (NSString*) newValue {  //  setter 생성
if (newValue != myField) {  //  생성된 setter는 새로운 객체가 기존 것과 다른지 확인한다.
[myField release];  //  기존 객체를 release 시킨다.
myField = [newValue retain];  //  새로운 객체를 retain 한다.
}
}

assign : getter 와 setter 둘 다 생성하며, 기존의 객체를 release 하지 않는다.

- (NSString*) myField {  //  getter 생성
return myField;
}
- (void) setMyField: (NSString*) newValue {  //  setter 생성
myField = newValue;
}


retain 과 release 외에도 Objective-C 에서는자동으로 메모리를 release 하는 오토릴리스 (autorelease) 풀을 제공한다.
이 풀은 기본적으로 객체에 대한 배열이며, 현재 이벤트에 대한 처리가 끝나면 Objective-C 런타임 시스템이 release 할 객체를 갖고 있는다.
어떤 객체를 autorelease 풀에 넣기 위해서는 다음과 같이 메시지를 보낸다.

[aString autorelease];

지금 당장의 retain 수는 변하지 않지만, 현재의 이벤트 루프가 끝나면 aString객체는 release 메시지를 받게 된다. autorelease는 처리와 관련한 성능에 영향을 미치므로, 자주 사용해서는 안 된다. 가능하면 명시적으로 retain 과 release 해주는 것이 더 좋다.






'공부 > iPhone' 카테고리의 다른 글

아이폰개발 용어 4  (0) 2010.10.03
아이폰개발 용어 3  (0) 2010.10.03
자주 쓰이는 프로퍼티 (Property) 속성  (0) 2010.10.02
아이폰개발 용어 2  (0) 2010.10.02
프로토콜 (Protocol)  (0) 2010.10.02
Posted by terebyte