본문 바로가기

교육/Objective-C

[Objective-C] 메모리 관리

1. 메모리 관리 함수

참조계수 출력 : retainCount

참조계수 증가 : retain

참조계수 감소 : release


2. 샘플 코드 

@interface Car :NSObject

-(void)dealloc;

@end


@implementation Car

-(void)dealloc

{

    NSLog(@"dealloc");

    

    [super dealloc];

}

@end



int main()

{

    Car* p1 = [[Car alloc] init];

    NSLog(@"p1 = %lu",[p1 retainCount]);

    Car* p2 = p1;

    NSLog(@"p1 = %lu",[p1 retainCount]);

    NSLog(@"p2 = %lu",[p2 retainCount]);

    [p2 retain];

    NSLog(@"p1 = %lu",[p1 retainCount]);

    NSLog(@"p2 = %lu",[p2 retainCount]);

    [p1 release];

    NSLog(@"p1 = %lu",[p1 retainCount]);

    NSLog(@"p2 = %lu",[p2 retainCount]);

    [p2 release];

    NSLog(@"p1 = %lu",[p1 retainCount]);

    return 0;

}


3. autorelease

release를 컴파일러가 알아서

idle time에 들어갈때 비워준다. 혹은 오토릴리즈풀을 release해줄때 비워준다.


4. 샘플코드

@interface Car :NSObject

-(void)dealloc;

@end


@implementation Car

-(void)dealloc

{

    NSLog(@"dealloc");

    

    [super dealloc];

}

@end



int main()

{

    Car* p1 =[Car alloc];

    [p1 release];

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    //Car* p2 =[[Car alloc] init];

    //[p2 autorelease];

    Car* p2 = [[[Car alloc] init] autorelease];

    [pool release];

    return 0;

}


5. 정적메소드

정적 메소드에서 초기화 할때는 autorelease를 붙여준다.

정적 메소드는 자주 사용되는 형식의 객체를 생성할때 쓴다. ex) NSArray arrayWith~

Conventional Constructor : 자주쓰는 형태를 클래스 함수 형태로 제공


6. 샘플 코드


@interface Car :NSObject

-(void)dealloc;

// 자주 사용되는 형식의 객체를 생성하는 정적 메소드

+(Car*)carWithRed;

@end


@implementation Car

-(void)dealloc

{

    NSLog(@"dealloc");

    

    [super dealloc];

}

+(Car*)carWithRed

{

    // Conventional Constructor

    Car* p =[[[Car alloc] init] autorelease];

    return p;

}

@end



int main()

{

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

//    Car* p1 = [[Car alloc] initWithColor:red speed:100];

    Car*p1 = [Car carWithRed];

    [pool release];

    NSLog(@"%x",p1); // 포인터 주소 찍기

    return 0;

}


7. Objective-C에서 제공하는 정적 메소드 예제

int main()

{

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // ObjC 객체 생성 2가지

    // 사용자 alloc

    NSArray* arr1 = [[NSArray alloc] initWithObjects:@"A",@"B", nil];

    

    // 정적 메소드

    NSArray* arr2 = [NSArray arrayWithObjects:@"A",@"B", nil];

    

    // NSArray arr3; // stack 객체 에러 objc 힙객체만 가능

    NSRange range;  // ok, c구조체

    

    [pool release];

    NSLog(@"%@ %@",arr1[0],arr2[0]);

    [arr1 release];

    NSLog(@"%@ %@",arr1[0],arr2[0]);

    return 0;

}

'교육 > Objective-C' 카테고리의 다른 글

[Objective-C] block  (0) 2016.07.26
[Objective-C] property  (0) 2016.07.26
[Objective-C] init  (0) 2016.07.26
[Objective-C] target-Action  (0) 2016.07.13
[Objective-C] selector  (0) 2016.07.13