• Xcode의 기본 컴파일러: LLVM(Low Level Virtual Machine)
    정적 분석기(Static Analyzer) : 애플의 LLVM 컴파일러 기술을 이용해 코드 분석 및 버그 찾음
  • Objective-C는 nil 객체에 메시지를 보내어도 죽지 않는다 (다만 실행이 안될뿐)
  • 지정된 초기화 메서드(Designated Initializer): 사용자 정의 초기화 메서드

 

 

NSObject

- (id)init : receiver 초기화
- (BOOL)isEqual:(id)anObject : 포인터 비교

 

  • Cocoa 클래스들의 초기화 메서드는 초기화 불가능하다면 nil return
- (id)init {
    self = [super init];
    
    if (self) {
        ...
    }
} 

 

 

 

 

isa: 객체를 생성하는 클래스 구조체를 가리키는 포인터

  • Objective-c 메시지 동작 방식: NSObject에는 isa라는 인스턴스 변수가 존재
  • 클래스 구조체
    - 클래스의 인스턴스 변수 유형과 이름
    - 클래스 메서드의 구현
    - 슈퍼클래스의 클래스 구조체를 가리키는 포인터

 

 

Selector : 클래스의 메서드 찾기

  • 각 메서드 이름 - 유일한(unique) 정수로 연결
    ex) [application respondsToSelector:@selector(registerUserNotificationSettings:)]

  • 컴파일할 때 컴파일러는 메시지를 보내야하는 곳에서 selector를 연결

  • 동작 방식

 

[myObject addObject:yourObject]; 
=> objc_msgSend(myobject, 12, yourObject);    // (addObject:의 selector는 12라고 가정)

1) objc_msgSend()는 myObject의 isa 포인터에서 클래스 구조체를 가져옴
2) 클래스 구조체에서 12에 연결된 메서드 찾음 (없다면 슈퍼클래스로 가서 찾고 아예없으면 예외 처리)

 

objective-c 데이터 구조 중 셀렉터를 메서드 이름으로 연결한 표가 있음 

 

+ Recent posts