어흥

[Objective-C] 기본 내용 2 본문

iOS

[Objective-C] 기본 내용 2

라이언납시오 2020. 10. 14. 09:20
728x90
반응형

1. ==, isEqual

- 원시 타입에선 '=='를 사용하여 값 비교

- 포인터 타입에선 '=='를 사용하여 주소값 비교(같은 객체인가?)

- isEqual : 내용 비교

NSString *str1 = @"abcd";
NSString *str2 = [NSString stringWithFormat:@"ab%@",@"cd"];
NSString *str3 = @"abcd";
NSString *str4 = str3;
        
NSLog(@"%@ %@ %@ %@",str1,str2,str3,str4);      //  abcd    abcd    abcd    abcd
str1==str2 ? NSLog(@"같다") : NSLog(@"다르다");      //다르다
str1==str3 ? NSLog(@"같다") : NSLog(@"다르다");      //같다
str3==str4 ? NSLog(@"같다") : NSLog(@"다르다");      //같다

[str1 isEqual:str2] ? NSLog(@"내용이 같다") : NSLog(@"내용이 다르다");     //내용이 같다

 

2. Description

- 목적: 객체에 대한 설명 수정

//Main.m
Rectangle *r1 = [[Rectangle alloc] initWithWidth:20 height:20];
//Description 적용 전
NSLog(@"R1 : %@",r1);       //R1 : <Rectangle: 0x1005af920>
//Description 적용 후
NSLog(@"R1 : %@",r1);       //R1 : Rectangle(0x100439870) 가로 :  20 세로 : 20


//Rectangle.m
-(NSString *)description {
    return [NSString stringWithFormat:@"Rectangle(%p) 가로 : % d 세로 : %d",self,_width,_height];
}

 

3. isKindOfClass v.s isMemberOfClass

- A isKindOfClass : [B class] -> A가 B의 자식 클래스거나, B 클래스인 경우 True 반환

- A isMemeberOfClass: [B class] -> A가 B와 같은 클래스인 경우 True 반환 

//Square클래스가 Rectangle 클래스를 상속하고 있다고 가정

//Square 객체 생성
Square *s1 = [[Square alloc] initWithWidth:20];

//비교
[s1 isKindOfClass:[Rectangle class]] ? NSLog(@"S1은 Rectangle Class거나 자식 클래스다") : NSLog(@"S1은 Rectangle Class의 자식클래스도, Rectangle 클래스도 아니다");	//S1은 Rectangle Class거나 자식 클래스다
[s1 isMemberOfClass:[Rectangle class]] ? NSLog(@"S1은 Rectangle Class다") : NSLog(@"S1은 Rectangle 클래스가 아니다");	//S1은 Rectangle 클래스가 아니다

 

4. 메모리 관리

- Alloc <-> Dealloc

  1) 객체를 생성 -> 해당 객체는 1의 Retain/Reference Count(참조수)를 가진다

  2) 해당 객체를 가르키던 트레이서를 nil로 바꾼다(참조수 1 감소. 만약 참조수가 0이 되면 런타임이 Dealloc 함수 실행하여 메모리 해제 문구 출력)

  3) 선언한 함수가 끝나면(지역 변수) 참조수가 양수였던 메모리 모두 수거(Dealloc)하면서 메모리 해제 문구 출력

 

[예제코드]

//Main.m 함수
#import <Foundation/Foundation.h>
#import "Tracer.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"===시작===");
        
        Tracer *obj1 = [[Tracer alloc] init];
        NSLog(@"obj1: %@",obj1);		//obj1객체의 주소 출력
        obj1.name = @"Obj1";
        obj1 = nil;

        Tracer *obj2 = [[Tracer alloc] init];
        NSLog(@"obj2: %@",obj2);		//obj2객체의 주소 출력
        obj2.name = @"Obj2";

        Tracer *obj3 = obj2;
        NSLog(@"obj3: %@",obj3);		//obj3객체의 주소 출력(=obj2객체의 주소)
        obj3.name = @"Obj3";
        obj2 = nil;
        NSLog(@"===끝===");
    }
    return 0;
}

//Tracer.m 함수
#import "Tracer.h"

@implementation Tracer

-(void)dealloc{
    NSLog(@"메모리에서 %@ 객체 해제",_name);
}

@end

 

[출력 결과물]

※ Obj1이랑 Obj2의 메모리 주소가 같은 이유는 Obj1이 메모리 해제되었기 때문에 해당 위치에 Obj2가 재할당!!

 

 

5. Mutable v.s Immutable

- Mutable(가변형): 객체 생성 이후 내용 변경 가능 -> 버퍼를 이용해서 데이터 저장

- Immutable(불가변형): 객체 생성 이후 내용 변경 불가

NSArray *array = [NSArray array];			//불가변형 배열 선언
NSMutableArray *array = [NSMutableArray array];		//가변형 배열 선언
@interface NSMutableArray: NSArray			//가변형이 불가변형 상속
728x90
반응형

'iOS' 카테고리의 다른 글

[Objective-c] Collection  (0) 2020.10.16
[Objective-C] 문자열, 파일, 프로토콜  (2) 2020.10.15
[Objective - C] 기본 개념  (0) 2020.09.24
[Swift] Animation  (0) 2020.09.15
[Swift] CollectionView  (0) 2020.09.15
Comments