보관물

Posts Tagged ‘ObjectLifeCycle’

Object lifecycle, Autorelease

2월 20, 2011 댓글 남기기

Object lifecycle

  1. Creating Object
  2. Memory Management (Retain Count)
  3. Destroying Object

Creating Object

  • +alloc
    object를 저장하기 위한 memory 할당
  • -init
    object 초기화

필요에 따라 -init에 해당하는 method를 구현할 수 있다.

-(id) initWithName:(NSString *)m_name {

if ( self = [super init]) {

name = m_name;

}

return self;

}

Memory Management

retain count는 Objective-C에서 memory를 관리하기위해 사용되는 값이며
최초 생성시 retain count는 1이 되고 더이상 object가 필요없을 때 retain count를 0으로 만들면 object는 해제된다.

  • +alloc, new
    object가 생성되면서 retain count가 1이 됨.
  • -copy
    object가 복사(value copy)되면서 retain count가 1이 됨.
  • retain
    retain count 1만큼 증가
  • release
    retain count 1만큼 감소

Destroying Object

retain count가 0이 되면 – dealloc이 자동으로 호출된다.
[super dealloc];을 호출하는걸 제외하고 dealloc을 직접적으로 호출하는 경우는 없다.

-(void) dealloc {

//ivar release
[name release];

//calls dealloc of superclass
[super dealloc];

}

Autorelease

alloc, new, copy로 생성되지 않은 object들 (예를 들면 NSString의 stringWithFormat:)은 autorelease형태로 create된다.

Autorelease로 지정된 object는 autorelease pool에서 알아서 release를 해주기 때문에 ownership을 갖게되도라도 이를 관리할 필요가 없다.
단 autorelease로 지정된 object를 retain, copy 하는 경우에는 release에 대한 책임을 져야한다.

Autorelease가 유용하게 쓰일때는 method 내에서 생성한 object를 return하는 경우이다.
자신이 생성한 object는 자신이 release하는게 기본이지만 method내에서 생성한 object를 return하는 경우에는 ownership이 외부로 넘어가게 되므로
더이상 release에 대한 책임을 질 수가 없게 된다.
이런경우 autorelease 지정을 하게되면 추후 사용하게 되지 않을 때(pool이 release될때) 자동으로 release가 되니 편리하다.

-(NSString *) makeName {

NSString *name = [[NSString alloc] initWithString:@”Andy”];

[name autorelease];

return name;

}

참고자료

iPhone Application Development (CS193P) – Winter 2010 : iTunes U
3. Custom Classes, Object lifecycle, Autorelease, Objective-C Properties