본문 바로가기

ios

Objective-C 메모리 관리

개인적으로 정리하는 차원에서 적는거라 100% 맞다는 보장은 못합니다. 규칙은 많은게 아닌데 생각을 많이 하게 되더군요. 
처음에 NSLog로 retainCount 찍으면서 보다보니.. 이걸로  해볼 수 있는게 아니더군요. ㅠㅠ
http://skyfe.tistory.com/entry/test  
http://skyfe.tistory.com/entry/ObjC-%EA%B0%9D%EC%B2%B4%EC%9D%98-retainCount-%EC%9D%B4%EC%95%BC%EA%B8%B0
위 블로그의 글을 읽고나서 미친짓이란걸 깨달았습니다.


헤더(.h) 파일에서 인스턴스 변수 선언하고 retain으로 property 정의했고..

@interface Test : NSObject {

NSMutableArray *instanceArray;

}

@property (retain, nonatomic) NSMutableArray *instanceArray;


소스(.m)파일에서 synthesize하고 dealloc에서 메모리 해제한 경우

@synthesize instanceArray;


- (void)dealloc {

[instanceArray release];
[super dealloc];

}


다음과 같이 정리했습니다.  ^^;

//1.인스턴스 변수에 대해 alloc한 객체를 대입했기때문에 retainCount가 +1이 되고 dealloc에서 해제되어 정상적으로 동작.

instanceArray = [[NSMutableArray alloc] init]; //O

//2.인스턴스변수에 autorelease된 객체를 대입했기때문에 이벤트 루프 종료후 autorelease pool에서 예고없이 해제될수 있음.

instanceArray = [NSMutableArray array]; //X

//아래와 같이 retain 해줄것

instanceArray = [[NSMutableArray array] retain]; //O

//아니면 property의 속성이 retain이라면 setter를 통해 autorelease된 객체를 대입하면 setter가 retinCount +1 해주기때문에 이상없음.

self.instanceArray = [NSMutableArray array]; //O

//3.property의 속성이 retain이면 setter가 retainCount +1을 하기때문에 1번처럼 변수에 직접 대입할것.

self.instanceArray = [[NSMutableArray alloc] init]; //X

instanceArray = [[NSMutableArray alloc] init]; //O

//아니면 아래처럼 객체 대입후 바로 release

NSMutableArray *tempArray = [[NSMutableArray alloc] init];

self.instanceArray = tempArray; //O

[tempArray release]

//4.로컬변수의 경우에는 alloc, copy, new한 객체애 대해서는 release 해줄것.

NSMutableArray *tempArray = [[NSMutableArray alloc] init]; //O

[tempArray release];

//5.tempArray가 즉 자기자신이 리턴될 경우 autorelease한 객체를 리턴할것

NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease]; //O

//6.tempArray를 release하지 않았기 때문에 memory leak.

NSMutableArray *tempArray = [[NSMutableArray alloc] init]; //X

//7.autorelease된 객체를 또 autorelease하기때문에 stack over됨.

NSMutableArray *tempArray = [[NSMutableArray array] autorelease]; //X

//8.autorelease된 객체를 또 release하기때문에 stack over됨.

NSMutableArray *tempArray = [NSMutableArray array]; 

[tempArray release]; //X


 

'ios' 카테고리의 다른 글

Tab Bar 사라지게 하는 방법  (0) 2020.04.03
WKWebView  (5) 2018.02.14
[책] Objective-C 2.0  (0) 2011.05.04
[책] 맥과 아이폰 개발자를 위한 Xcode  (0) 2011.05.04
맥용 SQLite Database Browser  (1) 2011.04.21