Altruistic Programmer's Blog (JP)

利他主義プログラマーのブログ

Archive for May, 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

May 3rd, 2011 at 5:26 pm

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

May 1st, 2011 at 10:01 pm