본문 바로가기
프로그래밍/iOS

메모리 관리 규칙

by 백룡화검 2012. 5. 19.

규칙1]

 - alloc, copy, new 를 포함하는 메서드는 retain된 객체를 리턴한다. 

  이 리턴되는 객처는 retain되어 있기 때문에 반드시 release를 호출해야 한다.


규칙2]

 - 자신이 retain 호출했다면 반드시 release를호출해야 한다.


규칙3]

 - 클래스메서드가 객체를 생성해 줄 때는  autorelease 객체를 리턴한다.

   그렇기 때문에 별도의 release를 호출하지 않아도 오토릴리즈 풀이 자동으로 release를 호출한다.

  하지만, 이 객체에 대한 retain을 호출했다면 같은 횟수만큼 release를 호출해야 한다.

 

 예)

  NSString *pStr = [NSString stringWithString:@"Test"];


규칙4]

 - 배열, 딕셔너리 등의 자료구조 클래스는 추가된 객체를 retain하고, 항목을 제거할 때 release를 한다.

  NSArray, NSDictionary, NSSet등의 자료구조 클래스는 항목으로 추가되는 객체에 retain을 한 번 호출한다.

 그리고 객체가 포함 객체에서 제거될 때 release를 호출한다. 그렇기 때문에 별도의 retain을 해 줄 필요는 없다.


규칙5]

 - retain 속성을 갖는 접근자의 경우(@property (retain) ... ) 객체가 설정될 때 자동으로 retain 된다.

예) 

 myImage = [[UIImage alloc] init]; // myImage retain '1'

self.userImage = myImage; // myImage retain '2'

[myImage release]; // myImage retain '1'


...


self.userImage = myImage2; // myImage retain '0'


규칙 6]

- 메서드가 리턴하는 객체는 autorelease을 하고 리턴하도록 한다.

예)

- (NSString *) findTopPlayer{ 

NSString *ret = [[top objectAtIndex:0] copy];

[ret autorelease];

return ret;


규칙7]

 - IBOutlet으로 연결되는 객체는 retain 되어 있다. 따라서, 반드시 release를 호출해야 한다.


예)

IBOutlet UIButton *button;


....

- (void) dealloc{

[button release];

[super dealloc];

}