[Objective-C] Objective-C-2.0 책요약 02


이전 편에 이쳐서 책(Objective-C 2.0)을 요약하는 포스팅을 올리려고한다.

책 요약 본

Table of Index

  • 01장 Hello Objective C
  • 02장 C의 확장
  • 03장 객체지향프로그래밍의 소개
  • 04장 상속
  • 05장 컴포지션(Composition)
  • 06장 소스 파일 구성
  • 07장 Xcode에 대하여
  • 08장 Foundation Kit 소개
  • 09장 메모리 관리
  • 10장 객체 초기화
  • 11장 프로퍼티
  • 12장 카테고리
  • 13장 프로토콜
  • 14장 AppKit 소개
  • 15장 FileIO
  • 16장 키-밸류 코딩 KVC
  • 17장 NSPredicate

08장 Foundation Kit 소개

  • 범위를 나타내는 구조체 : NSRange
typedef struct _NSRange{
    unsigned int location; unsigned int lenght;
} NSRange;
  • 기하학 관련 타입구조체 : NSPoint, NSSize, NSRect
typedef struct _NSPoint{
    float x; float y;
} NSPoint;

typedef struct _NSSize{
    float width; float height;
} NSSize;

typedef struct _NSRect{
    NSPoint origin; NSSize size;
} NSRect;
  • 클래스 메소드 : + 기호로 선언한 메소드. 주로 클래스의 새로운 인스턴스를 만드는데 사용된다.
  • 팩토리 메소드 : 새로운 객체를 만드는데 사용되는 클래스 메소드(ex) stringWithFormat)
  • NSString : Java-String => immutable
  • NSMutableString : Java-StringBuffer => mutable

09장 메모리 관리

객체의 Life Cycle

참조횟수 : reference counting(retain counting)

  • alloc, new, copy : retainCount = 1;
  • retain : retainCount++;
  • release : retainCount–;
  • dealloc : if(retainCount==0)

객체 소유권

특정 객체가 다른 객체를 가리키는 인스턴스 변수를 가지고 있다면, 객체를 소유하고 있다고 말할 수 있다. 이 때, 2개 이상의 retainCount 값을 가지게 되면, 우리는 조심히 이를 다뤄야한다. (함부로 dealloc이 되면 안되기 때문이다. 반대로 잘못 retain하게 되면 memory leak이 발생한다.)

Autorelease

  • NSAutoreleasePool : NSMutableArray를 사용해서 객체들을 추가하고, dealloc 메소드 안에서 배열에 있는 모든 객체에 release 메시지를 보내도록 만들어져 있다. 이 오토릴리즈풀은 스택으로 유지되기에 큰 부담이 없다.

10장 객체 초기화

  • 객체 할당 방법
    • new
    • alloc / init

객체 할당

  • 할당(allocation) : OS로부터 일정 메모리를 할당받은 후, 객체의 인스턴스변수들을 가지고 있는 위치가 그 메모리에 덧씌워져서, 실제로 그 객체가 메모리 주소를 갖게 되는 것.
  • alloc 메시지와 초기화
    • BOOL : NO
    • int : 0
    • float : 0.0
    • *(pointer variable) : nil

객체 초기화

  • 초기화(initialization) : 일정 메모리를 얻어와 객체 단체에 있어서 생산적인 멤버로 준비시킨다.
Car *car = [[Car alloc] init];        // OK

Car *car = [Car alloc]                // DO NOT !!
[car init]
  • 위의 두 초기화 방법 중, 두번째 방법은 피하는게 좋다.(피해야한다) 왜냐하면, alloc 과정에서 실제로는 다른 클래스, 예상치 못한 클래스가 할당될 수도 있기 때문이다.(예를 들면 클래스 클러스터 같은 경우) init 메소드는 인수를 받을 수 있으므로, 받아들인 인수를 살펴보고 더 적절한 객체의 다른 클래스를 선택할 수 있기에, alloc 과 init을 같이 사용하도록 하자 !

11장 프로퍼티

  • @property/@synthesize : 전처리기 -> Build and Run 을 하였을 때, prewritten/preformatted 코드 블락으로 대체 !!
  • 즉, getter / setter 를 자동적으로 생성해준다.

@property

@interface 에서 사용

Syntax

  • @property(attributes [, attribute2, …]) type name;

  • (attributes [, attribute2, …])

    • getter=getterName - getter의 이름을 getterName로 지정
    • setter=setterName - setter의 이름을 setterName로 지정
    • readwrite - 기본동작으로 getter와 setter를 모두 만듦. Mutually exclusive로 readwrite
    • readonly - getter만 만듦. Mutually exclusive로 readwrite. 값을 할당하려고 하면 컴파일 오류 발생
    • assign - 기본동작, setter가 간단한 할당을 사용(예 location = where;) 객체를 소유할 필요가 없을때 사용
    • retain - assign과 비슷하지만 레퍼런스 카운트를 증가. Mutually exclusive로 assign과 copy. 포인터객체를 할당할 경우에는 외부에서 객체가 릴리즈되어 파괴된 객체를 참조하는 문제를 막기 위해서 클래스가 멤버객체를 소유하도록 레퍼런스카운트를 증가(이전 값을 release)
    • copy - 할당하는데 객체의 복사본을 사용. Mutually exclusive로 assign과 retain. 포인터객체의 경우 레퍼런스의 값이 바뀌어 프로퍼티의 값이 바뀌는 걸 막기 위해 setter에서 복사본을 만들어서 할당하며 copy를 사용하려면 NSCopying 프로토콜을 구현한 객체에서만 유효
    • nonatomic - 엑세서들을 non-atomic으로 지정. 멀티쓰레드 환경에서 사용하지 않는 한 접근자를 더 빠르게 동작하게 해준다. Mutually exclusive락으로 접근자 메서드를 보호하지 말라고 지시하는 것. atomic이 기본동작.

@synthesize

@implementation 에서 사용

Syntax

  • @synthesize name;

@dynamic

@implementation 에서 사용

  • @synthesize대신에 사용할 수 있으며 getter와 setter메서드가 클래스 자신에 의해서 구현되지 않고 (슈퍼클래스같은) 다른 어딘가에 구현되어 있다고 알려주어 getter/setter가 구현되어 있지 않아도 컴파일러 경고를 받지 않도록 해줌.

Syntax

  • @dynamic name;