Altruistic Programmer's Blog (KR)

이타주의 프로그래머의 블로그

Archive for April, 2011

Base SDK와 Deployment Target의 의미

without comments

꼼꼼하게 공부하고 싶은 분은 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 버전으로 낮춰서 빌드해보면 된다.

Written by muscly

April 29th, 2011 at 9:09 pm

Posted in 프로그래밍

Objective-C 2.0에서 프라이빗 프로퍼티 정의하기

without comments

클래스의 헤더에 프로퍼티를 숨기고 싶은 경우에는 클래스 익스텐션을 사용할 수 있다.

// 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

카테고리보다 클래스 익스텐션이 좋은 이유는

  1. 프로퍼티를 정의할 수 있다
  2. 메소드를 선언만하고 구현하지 않으면 에러가 난다.

Written by muscly

April 29th, 2011 at 8:17 pm

Posted in 프로그래밍