어흥
[Objective-C] 기본 내용 2 본문
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