[Objective-C Tip] 메모리 관리

Objective-c 의 메모리 관리에 대해서 알아보겠습니다.

-alloc : 해당 객체에 메모리를 할당하고 레퍼런스 카운트를 1 올립니다.
-retain : 해당 객체의 레퍼런스 카운트를 1 올립니다.
-copy : 해당 객체의 복사본을 만듭니다. 그리고 복사본의 레퍼런스 카운트를 1 올립니다.
-release : 해당 객체의 레퍼런스 카운트를 1 낮춥니다.
-autorelease : 정해지지 않은 시점에 해당 객체의 레퍼런스 카운트가 -1 낮아집니다.

* 규칙

1. 블록 내에서 alloc, retain, copy의 수와 release, autorelease 수가 동일해야 합니다.
2. factory 함수를 사용해 생성한 객체의 경우는 대부분 autorelease로 반환됩니다. 따로 release를 할 필요가 없습니다.
3. 클래스의 인스턴스 변수들은 dealloc 메소드에서 다 release해야 합니다.

______________________________________________________________

인스턴스 메소드에서 인스턴스 변수에 새로운 값을 assign하는 방식에는 두가지가 있습니다.
인스턴스 변수명이 someObject 라고 할때
-(void) testRetainCount
{
someObject = xxx;       //첫번째방식
self.someObject = xxx;  //두번째방식
}
두번째 방식은 변수를 property화 하고 synthesize 했을 때만 사용 가능합니다.

두 방식 모두 assign하는 대상 주소는 같지만 retainCount의 차이가 발생하므로 주의를 요합니다.
someObject = xxx;  //잘못된 메모리 참조로 앱이 크래시 될 수 있습니다.
self.someObject = [xxx retain]; //메모리 릭이 발생합니다.
다음은 올바른 방법입니다.
someObject = [xxx retain];
self.someObject = xxx;


댓글

주간 인기글

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

[Angular] 모델, 값이 바뀌었는데 화면 template 이 업데이트 되지 않을 때 조치 팁

[AWS] Lambda + API GateWay를 이용해 간단한 RESTful API 만들기 #1

[AWS] Lambda + API GateWay를 이용해 간단한 RESTful API 만들기 #2

안드로이드에서 당겨서 새로고침(SwipeRefreshLayout) 쉽게 구현하기