> iPhone-iPad, Objective-C > objective-c 메모리 관리 개념과 프로퍼티 관계.

objective-c 메모리 관리 개념과 프로퍼티 관계.

처음에 Objective-C를 접하게 되면 조금 생소하게 느껴지는 부분이 메모리 관리 부분이다. (여기서 논하고 있는 메모리는 alloc으로 생성되는 동적메모리 부분이다.)

1. 기본 사용

{
    DataObject *localOne = [[DataObject alloc]init];
    localOne.No = i;
    localOne.Data = i * 99;
    
    [self.ListData addObject:localOne];
    
    NSLog(@"%@\tListItem RC: %d", [localOne description], [localOne retainCount]);
    
    [localOne release];
}

일반적인 개념으로는 alloc을 하면, 해당 메모리가 생성되면서 retain count가 1 증가한다.
그리고, release를 하면 해당 retain count가 1 감소한다.
이런 과정을 통해 retain count가 0이 되면 가베지 컬렉터가 해당 동적 메모리를 회수하는 구조를 갖는다.

그 외에도 우리가 일반적으로 메모리를 해제한다고 생각하기 쉬운 변수에 nil을 대입하는 방법도 있으나, 이것은 단순히 해당 변수에 저장된 실제 메모리 위치의 포인터를 지우는 작업이므로 동적 메모리를 해제하는 것에는 작용하지 않는다.
따라서, 특정 변수에 클래스 인스턴스에 nil을 대입하기 전에 동적 메모리를 release하지 않으면 메모리 릭을 만들어 낼 수 있을 것이다. (주의)

2. 프로퍼티 사용 –

DataObject *currentObject;
@property (retain, nonatomic) DataObject *CurrentObject;

{
    i = i + 1;
    
    if (!self.CurrentObject) {
        self.CurrentObject = [[DataObject alloc]init];
    }
    
    self.CurrentObject.No = i;
    self.CurrentObject.Data = i * 99;
    
    [self.ListData addObject:self.CurrentObject];
    
    NSLog(@"%@\tListItem RC: %d", [self.CurrentObject description], [self.CurrentObject retainCount]);
    
    [self.CurrentObject release]; 
    self.CurrentObject = nil;
}

위와 같이 프로퍼티를 사용하는 환경에서는 retain count가 프로퍼티의 속성에 영향을 받는다. 지금은 프로퍼티의 속성이 retain으로 되어 있다는 것에 주목하고, 모든 소스는 프로퍼티로 사용한 것도 확인할 수 있다. 이런 환경에서 retain count의 변동을 확인해 보자.
역시 동적 메모리가 생성되는 alloc에서 retain count는 1 증가하게 된다.(retain count = 1)
그리고 self.CurrentObject에 대입하는 과정에서 프로퍼티 속성이 retain이므로 다시 retain count가 1 증가한다. (총 retain count = 2)
다음으로 self.ListData에 넣으면서 다시 retain count가 1 증가한다. (이제 retain count = 3)
이제 이 데이터를 배열에 넣어서 다른 메소드 등에서 사용할 것이니 retain count를 진정시킬 필요가 있다. (다른 메소드에서 배열에서 삭제하면 메모리가 정리되기를 원한다.)

그러기 위해 self.CurrentObject를 release하면서 retain count가 1 감소한다. (retain count = 2)
다음으로 self.CurrentObejct에 nil을 대입하면서 다시 retain count가 감소한다. (최종 배열에 남은 메모리는 retain count = 1)

1번에서 본 일반적인 상황과 다른 점 중에 하나가 nil을 대입하는 부분이다. 1에서는 단순히 변수에 nil을 대입하므로 retain count에 영향을 미치지 않지만, self.CurrentObejct는 프로퍼티 속성이 retain 이므로 nil을 대입하는 과정에서 retain count가 감소하는 것이다.

그럼, 프로퍼티의 속성을 assign으로 주면 어떻게 될까? 아직 속성에 대한 정확한 이해가 없다면, 한번 테스트해 보기를 권장한다.
이상과 같이 프로퍼티와 클래스 변수를 혼용해서 사용하고, 부주의하게 release와 nil대입을 사용하면 메모리를 낭비하게 될 수 있다.

이상 동적 메모리 관리에 대한 간단한 내용을 정리해 보았다.

  1. 2011/06/10 11:28

    iOS5에서는 release가 필요없이 개발을 할 수 있게 되는 것 같군요.
    힙영역의 메모리 관리를 자동으로 하게 해 주는 자바나 닷넷과 비슷한 개념으로 변경되는 것 같은데, 조금 재미가 떨어지겠군요.
    그리고 안정적이기를 고대합니다.

  1. No trackbacks yet.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: