Archive for April, 2011
Base SDK와 Deployment Target의 의미
꼼꼼하게 공부하고 싶은 분은 SDK Compatibility Guide를 보시라.
(http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development)
Weak Link란?
- 링크할 때 라이브러리에 심볼(변수, 함수, 클래스 등)이 없어도 에러가 나지 않는다.
- 앱이 로딩될 때 심볼이 없어도 에러가 나지 않는다.
- 그래서 런타임에 심볼이 있는지 확인하고 써야한다.
Strong Link란?
- 링크할때나 로딩할때 심볼이 없으면 에러가 난다.
Base SDK 버전이란?
- 내 앱이 사용할 제일 높은 SDK(혹은 OS) 버전
- 이 버전보다 높은 버전에 새로 생긴 API는 쓸 수 없다.
Deployment Target 버전이란?
- 내 앱이 사용할 제일 낮은 SDK (혹은 OS) 버전
- 이 버전보다 높은 버전의 SDK에 있는 API는 Weak Link가 된다.
- 이 버전과 같거나 낮은 버전의 SDK에 있는 API는 Strong Link가 된다.
그래서 어떻게 쓸까?
- 내 앱이 지원할 OS의 최저, 최고 버전을 정한다.
- Base SDK에 최고 버전을 설정한다.
- Deployment Target에 최저 버전을 설정한다.
- Weak Link가 되는 심볼에 대해서는 런타임에 존재하는지 확인한 다음에 써야한다.
- Strong Link가 되는 심볼은 컴파일 타임에 에러가 발생한다.
주의 사항
- 베이스 클래스가 존재하지 않는 경우 자식 클래스도 존재하지 않는 것으로 간주한다.
- 클래스 인터페이스에 정의한 델리게이트가 존재하지 않는 경우 앱 실행시에 런타임 에러가 난다.
팁
- 특정 OS 버전에서 발생할 수 있는 문제점을 컴파일 에러로 발생시키려면 Base SDK를 해당 OS 버전으로 낮춰서 빌드해보면 된다.
Objective-C 2.0에서 프라이빗 프로퍼티 정의하기
클래스의 헤더에 프로퍼티를 숨기고 싶은 경우에는 클래스 익스텐션을 사용할 수 있다.
// A.h
@interface A : NSObject {
}
-(void)setXXX:(int)i;
-(int)xxx;
@end
// A.m
#import "A.h"
@interface A()
@property int m; // HERE
@end
@implementation A
@synthesize m; // AND HERE
-(void)setXXX:(int)i {
self.m = i;
}
-(int)xxx {
return self.m;
}
@end
카테고리보다 클래스 익스텐션이 좋은 이유는
- 프로퍼티를 정의할 수 있다
- 메소드를 선언만하고 구현하지 않으면 에러가 난다.