Apple Developer Connection
Advanced Search
Member Login 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




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
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