0
第13回iPhone輪講
やるしかない!
クラスとインスタンス
NSObjectのメソッドはNSObject自体に対して使われるとい
うより,そのサブクラスである,あらゆるクラスおよび
インスタンスで共通して使われる
クラスとインスタンス
- (Class)class
レシーバに属するクラスのクラスオブジェクトを返す
+ (Class)class
クラスオブジェクトを返す
クラスオブジェクトを他のメッセージの引数としたり
変数に代入する場合はこのクラスメソッ...
クラスとインスタンス
- (BOOL)isMemberOfClass:(Class)aClass
レシーバが引数のクラスのインスタンスかどうか調べる
- (BOOL)isKindIfClass:(Class)aClass
レシーバが引数のクラス...
クラスとインスタンス
- (Class)superclass
レシーバの属するクラスのスーパークラスのクラスオブ
ジェクトを返す
+ (Class)superclass
レシーバのスーパークラスのクラスオブジェクトを返す
インスタンスの生成と解放
+ (id)alloc
レシーバとして指定されたクラスのインスタンスを生成し
ます
常にイニシャライザと組み合わせて用いる必要がある
- (void)dealloc
インスタンスを解放する
このメソッドはrelease...
インスタンスの生成と解放
- (oneway void)release
レシーバのリファレンスカウンタを1つ減らす
リファレンスカウンタが0になると,deallocメソッドが
呼び出され,レシーバが解放される
- (id)retain
レシーバ...
インスタンスの生成と解放
- (id)autorelease
レシーバを現在有効な自動解放プールに追加し,
レシーバ自体を返す
- (NSUInteger)retainCount
レシーバのリファレンスカウンタを値として返す
デバッグ用
NSU...
インスタンスの生成と解放
- (void)finalize
ガーベジコレクションがレシーバを解放する直前に実行
初期化
- (id)init
allocで生成されたインスタンスを初期化する
サブクラスではinitを上書きするか,新たなイニシャライ
ザinit...という名前で定義して初期化を行う
+ (void)initialize
クラスの初期化(クラ...
初期化
+ (id)new
一般にはallocとinitの呼び出しを組み合わせたもの
newメソッドで返されるインスタンスのオーナーは
呼び出し側のオブジェクトになる
オブジェクトの比較
- (BOOL)isEqual:(id)anObject
レシーバと引数anObjectが等しいと判断される場合YESを
返す
原則としてオブジェクトへの同じポインタを持つものは
等しいと見なされる
サブクラスは加えて「同じ...
オブジェクトの比較
比較のためのメソッドとしてcompare:や
isEqualto...という,そのクラス特有の比較メソッド
を持っていることもある
どのメソッドを利用したらよいのか,
目的に応じて考える必要がある
オブジェクトの内容記述
+ (NSString *)deacription
レシーバのクラスの内容を表すNSStringの文字列を返す
通常はクラス名が返される
- (NSString *)description
レシーバのインスタンスオブジェ...
セレクタとSEL型
プログラム内で,メソッド宣言やメッセージ式として書かれた
セレクタは,コンパイル時に内部表現の値に変換される
この内部表現に対応するデータ型をSEL型と呼ぶ
セレクタとSEL型
ObjCではセレクタの内部表現をプログラムで扱えるように
プログラム上のセレクタの表記からSEL型データを得る
コンパイラ指示子@selector()が用意されている
@selector(mutableCopy);
@sel...
セレクタとSEL型
セレクタが異なれば対応するSEL型も異なり,
同じセレクタには必ず同じSEL型の値が対応する
SEL型の変数が有効なセレクタを値として持っていない事を
表したい場合
NULLを使うか,(SEL)0という表現を使う
セレクタとSEL型
SEL型の値を使ってメッセージを送信できる
- (id)performSelector:(SEL)aSelector
aSelectorの示すメッセージをレシーバに送信し
その結果を返す
- (id)performSelec...
メッセージ探索
すべてのインスタンスにはisaというClass型のインスタンス変
数が存在している
これがクラスオブジェクトを示している
メッセージ探索
まずランタイムシステムは,メッセージと同じセレクタを持つ
メソッドがこのクラス内に存在するか調べる
存在すればそのメソッドを実行する
存在しなければ,スーパークラスを辿って行ってメソッドが
存在するか調べる
ルートクラスにまでさ...
メッセージ探索
ランタイムシステムは,あるクラスがどのセレクタに対応する
メソッドを持っていて,その定義の場所はどこか,
という情報を内部的にキャッシュとして蓄えている
次に同じメッセージが送られたときには,キャッシュの
情報を利用して,探索を...
メッセージ探索
あるオブジェクトが指定したセレクタに対応したメソッドを
実装しているかどうか,動的に調べる事が出来る
aSelectorの示すメッセージを処理できるメソッドが
レシーバに実装されているか,継承されていれば
YESを返す
レシーバ...
selfへの代入
selfはメッセージを受け取ったオブジェクト自体を表す
それ自体に再度メッセージを送ったり,メッセージの
引数やメソッドの返り値として使う事が出来る
selfの代入
selfに値を代入するという使い方がある
イニシャライザの定義内では,スーパークラスのイニシャ
ライザの返り値をselfに代入する書き方を示した
- (id)initWithMax:(int)a
{
if ((self = [s...
クラスオブジェクトとルートクラス
クラスオブジェクトもオブジェクトなので,
ルートクラスであるNSObjectを継承したクラスの
「インスタンスとして」振る舞う
クラスオブジェクトとルートクラス
次のような式を実行するとYESが返される
このことはクラスオブジェクトに相当するオブジェクトが
存在している事を示している
クラスオブジェクトのクラスの事をメタクラスと呼ぶ
ObjCではプログラムでメタクラスを...
クラスオブジェクトとルートクラス
SEL型を用いれば,実行されるメソッドを動的に
変更する事が可能
Applicationフレームワークでは実際に,この仕組みを
用いてGUI部品間のメッセージ送受信を実現している
ターゲット-アクション・パラダイム
このクラスはSEL型変数action
id型変数targetをインスタンス
変数として持っている
@interface myCell : NSObject
{
SEL action;
id target;
....
ターゲット-アクション・パラダイム
このクラスのインスタンスに対
してperformClick:メッセージが
送られると,targetが
保持しているオブジェクトに
対してactionが表すメッセージ
が送られる
@interface myCe...
ターゲット-アクション・パラダイム
このときの引数は
performClick:の引数が使われる
@interface myCell : NSObject
{
SEL action;
id target;
...
}
- (void)setAc...
ターゲット-アクション・パラダイム
Applicationフレームワークでは
このような原理でGUI部品
オブジェクト間の通信を
実現している
これを
ターゲット-アクション・
パラダイムと呼ぶ
@interface myCell : NSOb...
ターゲット-アクション・パラダイム
Applicationフレームワークのターゲット-アクション
・パラダイムで,メッセージとして使われるのは
次のようにid型の引数を1つだけ持ち,返り値の無い形式の
メソッドだけ
この形式のメソッドをアクショ...
Customize...
obj
id target obj
SEL action showPanel
[button setTarget:obj];
[button setAction:@selector
          (showpan...
Customize...
obj
id target obj
SEL action showPanel
[button setTarget:obj];
[button setAction:@selector
          (showpan...
Customize...
obj
id target obj
SEL action showPanel
[button setTarget:obj];
[button setAction:@selector
          (showpan...
Customize...
obj
id target obj
SEL action showPanel
[button setTarget:obj];
[button setAction:@selector
          (showpan...
ターゲット-アクション・パラダイム
Interface Builderで自動生成されるObjective-Cの
ソースコードには,アクションメソッドは以下のように
定義される
IBActionはマクロでvoidに定義される
- (IBActio...
ターゲット-アクション・パラダイム
オブジェクトのインスタンス変数のうち,GUI部品や
他のオブジェクトを参照するためにInterface Builderで
利用されるものはアウトレットと呼ばれる
ターゲット-アクション・パラダイム
Interface Builderがソースコードを自動生成した場合
例えばNSButton型の部品を参照するための
インスタンス変数の宣言は以下のようになる
IBOutlet NSButton *theBut...
ターゲット-アクション・パラダイム
IBOutletもマクロで何も無い空白として定義される
IBOutoletはInterface Builderに対する目印として
使われている
Interface Builderはid型のインスタンス変数も
...
おわり
Upcoming SlideShare
Loading in...5
×

Objc04

523

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
523
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Objc04"

  1. 1. 第13回iPhone輪講 やるしかない!
  2. 2. クラスとインスタンス NSObjectのメソッドはNSObject自体に対して使われるとい うより,そのサブクラスである,あらゆるクラスおよび インスタンスで共通して使われる
  3. 3. クラスとインスタンス - (Class)class レシーバに属するクラスのクラスオブジェクトを返す + (Class)class クラスオブジェクトを返す クラスオブジェクトを他のメッセージの引数としたり 変数に代入する場合はこのクラスメソッドを使う - (id)self レシーバ自体を返す
  4. 4. クラスとインスタンス - (BOOL)isMemberOfClass:(Class)aClass レシーバが引数のクラスのインスタンスかどうか調べる - (BOOL)isKindIfClass:(Class)aClass レシーバが引数のクラスのインスタンスか,あるいは そのクラスのサブクラスのインスタンスかどうかを調べる + (BOOL)isSubclassOfClass:(Class)aClass レシーバが引数のクラスのサブクラスか,その自体である 場合にYESを返す
  5. 5. クラスとインスタンス - (Class)superclass レシーバの属するクラスのスーパークラスのクラスオブ ジェクトを返す + (Class)superclass レシーバのスーパークラスのクラスオブジェクトを返す
  6. 6. インスタンスの生成と解放 + (id)alloc レシーバとして指定されたクラスのインスタンスを生成し ます 常にイニシャライザと組み合わせて用いる必要がある - (void)dealloc インスタンスを解放する このメソッドはreleaseの結果として呼び出される
  7. 7. インスタンスの生成と解放 - (oneway void)release レシーバのリファレンスカウンタを1つ減らす リファレンスカウンタが0になると,deallocメソッドが 呼び出され,レシーバが解放される - (id)retain レシーバのリファレンスカウンタを1つ増やし, レシーバ自体を返す
  8. 8. インスタンスの生成と解放 - (id)autorelease レシーバを現在有効な自動解放プールに追加し, レシーバ自体を返す - (NSUInteger)retainCount レシーバのリファレンスカウンタを値として返す デバッグ用 NSUIntegerは符号なし整数
  9. 9. インスタンスの生成と解放 - (void)finalize ガーベジコレクションがレシーバを解放する直前に実行
  10. 10. 初期化 - (id)init allocで生成されたインスタンスを初期化する サブクラスではinitを上書きするか,新たなイニシャライ ザinit...という名前で定義して初期化を行う + (void)initialize クラスの初期化(クラス内で共通に使われる変数の初期設 定などを行う)に利用する そのクラスに対して送られる初めてのメッセージに 先立って自動的に実行される
  11. 11. 初期化 + (id)new 一般にはallocとinitの呼び出しを組み合わせたもの newメソッドで返されるインスタンスのオーナーは 呼び出し側のオブジェクトになる
  12. 12. オブジェクトの比較 - (BOOL)isEqual:(id)anObject レシーバと引数anObjectが等しいと判断される場合YESを 返す 原則としてオブジェクトへの同じポインタを持つものは 等しいと見なされる サブクラスは加えて「同じ値を持つもの」を等しいと 判断するように定義が拡張されていることがある
  13. 13. オブジェクトの比較 比較のためのメソッドとしてcompare:や isEqualto...という,そのクラス特有の比較メソッド を持っていることもある どのメソッドを利用したらよいのか, 目的に応じて考える必要がある
  14. 14. オブジェクトの内容記述 + (NSString *)deacription レシーバのクラスの内容を表すNSStringの文字列を返す 通常はクラス名が返される - (NSString *)description レシーバのインスタンスオブジェクトの内容を表す 通常はクラス名とid値を表示するが,サブクラスによって 独自の定義をする事もある
  15. 15. セレクタとSEL型 プログラム内で,メソッド宣言やメッセージ式として書かれた セレクタは,コンパイル時に内部表現の値に変換される この内部表現に対応するデータ型をSEL型と呼ぶ
  16. 16. セレクタとSEL型 ObjCではセレクタの内部表現をプログラムで扱えるように プログラム上のセレクタの表記からSEL型データを得る コンパイラ指示子@selector()が用意されている @selector(mutableCopy); @selector(compare:) @selector(replaceobjectAtIndex:WithObject:)
  17. 17. セレクタとSEL型 セレクタが異なれば対応するSEL型も異なり, 同じセレクタには必ず同じSEL型の値が対応する SEL型の変数が有効なセレクタを値として持っていない事を 表したい場合 NULLを使うか,(SEL)0という表現を使う
  18. 18. セレクタとSEL型 SEL型の値を使ってメッセージを送信できる - (id)performSelector:(SEL)aSelector aSelectorの示すメッセージをレシーバに送信し その結果を返す - (id)performSelector:(SEL)aSelector withObject:(id)anObject aSelectorの示すメッセージを,anObjectを引数として レシーバに送信し,その結果を返す
  19. 19. メッセージ探索 すべてのインスタンスにはisaというClass型のインスタンス変 数が存在している これがクラスオブジェクトを示している
  20. 20. メッセージ探索 まずランタイムシステムは,メッセージと同じセレクタを持つ メソッドがこのクラス内に存在するか調べる 存在すればそのメソッドを実行する 存在しなければ,スーパークラスを辿って行ってメソッドが 存在するか調べる ルートクラスにまでさかのぼっても目的のメソッドが発 見できなかった場合,実行時エラーが発生する
  21. 21. メッセージ探索 ランタイムシステムは,あるクラスがどのセレクタに対応する メソッドを持っていて,その定義の場所はどこか, という情報を内部的にキャッシュとして蓄えている 次に同じメッセージが送られたときには,キャッシュの 情報を利用して,探索を繰り返す必要がないようにする
  22. 22. メッセージ探索 あるオブジェクトが指定したセレクタに対応したメソッドを 実装しているかどうか,動的に調べる事が出来る aSelectorの示すメッセージを処理できるメソッドが レシーバに実装されているか,継承されていれば YESを返す レシーバとなるクラスがaSelectorの示すメッセージを 処理できるインスタンスメソッドを実装しているか 継承していればYESを返す - (BOOL)respondsToSelector:(SEL)aSelector - (BOOL)instancesRespondToSelector:(SEL)aSelector
  23. 23. selfへの代入 selfはメッセージを受け取ったオブジェクト自体を表す それ自体に再度メッセージを送ったり,メッセージの 引数やメソッドの返り値として使う事が出来る
  24. 24. selfの代入 selfに値を代入するという使い方がある イニシャライザの定義内では,スーパークラスのイニシャ ライザの返り値をselfに代入する書き方を示した - (id)initWithMax:(int)a { if ((self = [super init]) == nil) { max = a; } return self; }
  25. 25. クラスオブジェクトとルートクラス クラスオブジェクトもオブジェクトなので, ルートクラスであるNSObjectを継承したクラスの 「インスタンスとして」振る舞う
  26. 26. クラスオブジェクトとルートクラス 次のような式を実行するとYESが返される このことはクラスオブジェクトに相当するオブジェクトが 存在している事を示している クラスオブジェクトのクラスの事をメタクラスと呼ぶ ObjCではプログラムでメタクラスを扱う事は無い [[NSString class] isKindOfClass:[NSObject class]]
  27. 27. クラスオブジェクトとルートクラス SEL型を用いれば,実行されるメソッドを動的に 変更する事が可能 Applicationフレームワークでは実際に,この仕組みを 用いてGUI部品間のメッセージ送受信を実現している
  28. 28. ターゲット-アクション・パラダイム このクラスはSEL型変数action id型変数targetをインスタンス 変数として持っている @interface myCell : NSObject { SEL action; id target; ... } - (void)setAction:(SEL)aSelector; - (void)setTarget:(id)anObject; - (void)performClick:(id)sender; ... @end @implementation myCell - (void)setAction:(SEL)aSelector { action = aSelector; } - (void)setTarget:(id)anObject { target = anObject; } - (void)performClick:(id)sender { (void)[target performSelector:action withObject:sender]; } ... @end
  29. 29. ターゲット-アクション・パラダイム このクラスのインスタンスに対 してperformClick:メッセージが 送られると,targetが 保持しているオブジェクトに 対してactionが表すメッセージ が送られる @interface myCell : NSObject { SEL action; id target; ... } - (void)setAction:(SEL)aSelector; - (void)setTarget:(id)anObject; - (void)performClick:(id)sender; ... @end @implementation myCell - (void)setAction:(SEL)aSelector { action = aSelector; } - (void)setTarget:(id)anObject { target = anObject; } - (void)performClick:(id)sender { (void)[target performSelector:action withObject:sender]; } ... @end
  30. 30. ターゲット-アクション・パラダイム このときの引数は performClick:の引数が使われる @interface myCell : NSObject { SEL action; id target; ... } - (void)setAction:(SEL)aSelector; - (void)setTarget:(id)anObject; - (void)performClick:(id)sender; ... @end @implementation myCell - (void)setAction:(SEL)aSelector { action = aSelector; } - (void)setTarget:(id)anObject { target = anObject; } - (void)performClick:(id)sender { (void)[target performSelector:action withObject:sender]; } ... @end
  31. 31. ターゲット-アクション・パラダイム Applicationフレームワークでは このような原理でGUI部品 オブジェクト間の通信を 実現している これを ターゲット-アクション・ パラダイムと呼ぶ @interface myCell : NSObject { SEL action; id target; ... } - (void)setAction:(SEL)aSelector; - (void)setTarget:(id)anObject; - (void)performClick:(id)sender; ... @end @implementation myCell - (void)setAction:(SEL)aSelector { action = aSelector; } - (void)setTarget:(id)anObject { target = anObject; } - (void)performClick:(id)sender { (void)[target performSelector:action withObject:sender]; } ... @end
  32. 32. ターゲット-アクション・パラダイム Applicationフレームワークのターゲット-アクション ・パラダイムで,メッセージとして使われるのは 次のようにid型の引数を1つだけ持ち,返り値の無い形式の メソッドだけ この形式のメソッドをアクションメソッドと呼ぶ - (void) XXXXXXX : (id)sender;
  33. 33. Customize... obj id target obj SEL action showPanel [button setTarget:obj]; [button setAction:@selector           (showpanel:)]; showPanel : button button クリックでメッセージ送信 参照 ターゲット-アクション・パラダイム ボタンが押されたり, スライダが動かされた時 あらかじめ設定された targetに,actionで指定 されたメッセージが 送られる
  34. 34. Customize... obj id target obj SEL action showPanel [button setTarget:obj]; [button setAction:@selector           (showpanel:)]; showPanel : button button クリックでメッセージ送信 参照 ターゲット-アクション・パラダイム メッセージの引数には そのGUI部品のidが渡され る
  35. 35. Customize... obj id target obj SEL action showPanel [button setTarget:obj]; [button setAction:@selector           (showpanel:)]; showPanel : button button クリックでメッセージ送信 参照 ターゲット-アクション・パラダイム これによりtargetとして 指定されたオブジェクト では,どの部品から どのようなメッセージを 送られたのか知る事が出 来る
  36. 36. Customize... obj id target obj SEL action showPanel [button setTarget:obj]; [button setAction:@selector           (showpanel:)]; showPanel : button button クリックでメッセージ送信 参照 ターゲット-アクション・パラダイム 通常はターゲットとアク ションの指定にそれぞれ メッセージsetTarget:と setAction:が使われる カウンタ方式を利用 している場合でも, setTarget:は引数の オブジェクトを保持 (retain)しない
  37. 37. ターゲット-アクション・パラダイム Interface Builderで自動生成されるObjective-Cの ソースコードには,アクションメソッドは以下のように 定義される IBActionはマクロでvoidに定義される - (IBAction) XXXXXXX : (id)sender;
  38. 38. ターゲット-アクション・パラダイム オブジェクトのインスタンス変数のうち,GUI部品や 他のオブジェクトを参照するためにInterface Builderで 利用されるものはアウトレットと呼ばれる
  39. 39. ターゲット-アクション・パラダイム Interface Builderがソースコードを自動生成した場合 例えばNSButton型の部品を参照するための インスタンス変数の宣言は以下のようになる IBOutlet NSButton *theButton;
  40. 40. ターゲット-アクション・パラダイム IBOutletもマクロで何も無い空白として定義される IBOutoletはInterface Builderに対する目印として 使われている Interface Builderはid型のインスタンス変数も アウトレットとみなす
  41. 41. おわり
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×