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

readonly
프로퍼티가 변경되지 않도록 할 때 사용한다. 필드의 값을 바꾸는 메소드를 사용자가 직접 만들 수 있기는 하지만, 컴파일러가 setter를 자동으로 생성해 주지는 않는다.

retain
객체의 값을 다룰 때 주로 사용한다. 컴파일러는 입력값으로 쓰이는 객체를 retain 하고, 이전에 있던 객체는 release 한다.

readwrite
프로퍼티를 변경할 필요가 있을 때 사용한다. 컴파일러는 getter 와 setter 를 생성해 준다. 기본값이다.

copy
전달된 원래의 값이 변경되지 않도록 할 때 사용한다. 예를들어 배열을 프로퍼티로 할당할 때, 프로퍼티로 지정된 다음에도 원래 배열에 있던 값을 보존하고자 하는 경우에 쓰인다. 객체를 복제하고 복제된 객체를 프로퍼티에 지정하게 된다.

assign
int 나 float 와 같은 기본형을 다룰 때 사용한다. 컴파일러는 setter 를 단순히 "myField = value" 와 같은 단순 할당문으로 만든다. 이것이 기본값이다. 그러나 대부분 객체를 다룰 때에는 메모리 관리 측면에서 적절하지 않다.

nonatomic
기본적으로 생성된 접근자 메소드는 프로퍼티의 값을 변경할때, 뮤텍스 (mutex) 를 사용하도록 되어 있어서 멀티 쓰레드 환경에서 안전하게 실행할 수 있다. 이런 특성을 atomic 이라고 한다. 그러나 클래스가 멀티 쓰레드 환경에서 실행되는 것이 아니라면, 이것은 낭비이므로 nonatomic 으로 속성을 선언하면 불필요한 뮤텍스 관련 처리를 하지 않도록 할 수 있다.

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

아이폰개발 용어 3  (0) 2010.10.03
메모리 관리  (0) 2010.10.02
아이폰개발 용어 2  (0) 2010.10.02
프로토콜 (Protocol)  (0) 2010.10.02
피커 (Picker)  (0) 2010.10.02
Posted by terebyte
2010. 10. 2. 22:44
먼저 이 글은 모두 Head First iPhone Development 책을 읽고 내게 필요한 부분, 중요한 부분, 느낀점등을 잊지 않기위해, 나중에 글쓴이가 봤을 때 왜 이렇게 했었는지 등을 다시 한번 확인하기 위해 작성한것임을 밝힙니다.

Datasource : 피커와 같은 컨트롤에게 제공할 데이터를 갖고 있다.
HIG(Human Interface Guide) : 아이폰 앱이 따라야 할 UI 가이드라인으로써 애플이 제공하는 문서
File's Owner : NIB 파일이 로드되고 나서 이 뷰를 소유할 객체를 나타내는 프록시
Picker : 사용자가 이미 정해져 있는 여러 선택사항 중에 하나를 고를 수 있는 컨트롤
Utility : 대부분 하나의 화면으로 구성되고, 사용자의 입력 없이 기본 정보를 제공하는 앱 타입
Protocol : 객체가 처리할 수 있는 메시지들의 규약(보통 Data Source 와 Delegate 가 이것을 따른다)
Delegate : 다른 객체들이 처리할 것 중 일부를 대신 처리하는 객체
Developer Documentation : 프로토콜이나 컨트롤에 익숙치 않다면 참조해야 할 것.
Productivity : 계층화된 데이터를 관리하는 앱의 일반적인 타입
Immersive : 주로 고유한 컨트롤 및 UI를 갖고있는 타입의 앱
NIB File : xib 확장자를 갖는 파일을 부르는 이름

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

메모리 관리  (0) 2010.10.02
자주 쓰이는 프로퍼티 (Property) 속성  (0) 2010.10.02
프로토콜 (Protocol)  (0) 2010.10.02
피커 (Picker)  (0) 2010.10.02
애플 API문서 보기  (0) 2010.10.02
Posted by terebyte