|
|
Log In | Not a Member? |
Contact ADC |
| < 前ページ次ページ > |
メソッドの実装を、動的に行うと良い場合があります。たとえば、Objective-Cの宣言されたプロパティの機能(プロパティを参照)に、次のような@dynamicディレクティブが含まれています。
@dynamic propertyName; |
これは、プロパティに関連付けられているメソッドが動的に提供されることをコンパイラに知らせます。
メソッドresolveInstanceMethod:とresolveClassMethod:を実装して、指定したセレクタにインスタンスメソッドとクラスメソッドをそれぞれ動的に実装できます。
Objective-Cのメソッドは単純なCの関数で、少なくとも2つの引数(selfおよび_cmd)をとります。class_addMethod関数を使用すると、メソッドとして関数をクラスに追加できます。つまり、
void dynamicMethodIMP(id self, SEL _cmd) { |
// 実装 .... |
} |
であれば、以下のように、resolveInstanceMethod:を使用して、上記の関数をメソッド(resolveThisMethodDynamically)としてクラスに動的に追加できます。
@implementation MyClass |
+ (BOOL)resolveInstanceMethod:(SEL)aSEL |
{ |
if (aSEL == @selector(resolveThisMethodDynamically)) { |
class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:"); |
return YES; |
} |
return [super resolveInstanceMethod:aSEL]; |
} |
@end |
転送メソッド(転送で説明しています)と動的メソッド解決は、大部分は相互に独立しています。クラスには、転送メカニズムが開始する前にメソッドを動的に解決する機会があります。respondsToSelector:またはinstancesRespondToSelector:が呼び出されると、動的メソッドリゾルバが、まずセレクタにIMPを渡す機会を得ます。resolveInstanceMethod:を実装しながら、特定のセレクタは実際には転送メカニズムを通じて転送する場合、セレクタにはNOを返します。
| < 前ページ次ページ > |
Last updated: 2007-10-31
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |