高度な検索
Apple Developer Connection
Member Login ログイン | ご入会 ADC連絡先

< 前ページ次ページ >

objc_addClass


クラス定義を Objective-C ランタイムに登録します。

void objc_addClass(Class myClass);

パラメータの説明
myClass
objc_class データ構造体へのポインタ。登録したいクラス定義を渡します。

解説

クラス定義を正しくセットアップしていることと、そのメタクラス定義とスーパークラスの定義との関連性が適切であることを確認してください。リスト 4-1 は、クラスを正しく作成し、Objective-C ランタイムに追加する方法を示しています。クラスを追加した後は、Foundation フレームワークの関数 NSClassFromString を使って、このクラスの objc_class データ構造体へのポインタを取得できます。

スレッドの安全性の理由から、登録済みのクラスを Objective-C ランタイムから削除することはできません。

リスト 4-1 Objective-C クラス定義の作成

BOOL CreateClassDefinition( const char * name, 
        const char * superclassName )
{
    struct objc_class * meta_class;
    struct objc_class * super_class;
    struct objc_class * new_class;
    struct objc_class * root_class;
    va_list             args;
    //
    // スーパークラスが存在しており、同じ名前のクラスを誰かが
    // すでに実装していないことを保証する
    //
    super_class = (struct objc_class *)objc_lookUpClass (superclassName);
    if (super_class == nil)
    {
        return NO;
    }
	
    if (objc_lookUpClass (name) != nil) 
    {
        return NO;
    }
    // ルートクラスを探す
    root_class = super_class;
    while( root_class->super_class != nil )
    {
        root_class = root_class->super_class;
    }
    // クラスとそのメタクラス用に領域を割り当てる
    new_class = calloc( 2, sizeof(struct objc_class) );
    meta_class = &new_class[1];
    // クラスのセットアップ
    new_class->isa      = meta_class;
    new_class->info     = CLS_CLASS;
    meta_class->info    = CLS_META;
    //
    // クラス名のコピーを作成する。
    // 効率のため、メタクラスとクラス自体で、この名前のコピーを 
    // 共有するが、これはランタイムの必須条件ではない
    // 
    //
    new_class->name = malloc (strlen (name) + 1);
    strcpy ((char*)new_class->name, name);
    meta_class->name = new_class->name;
    //
    // 空のメソッドリストを割り当てる。
    // メソッドの追加は後でも可能。
    //
    new_class->methodLists = calloc( 1, sizeof(struct objc_method_list *) );
    meta_class->methodLists = calloc( 1, sizeof(struct objc_method_list *) );
    //
    // クラス定義を正しい階層に接続する:
    // クラスをスーパークラスに接続。
    // メタクラスをスーパークラスのメタクラスに接続。
    // メタクラスのメタクラスを
    // ルートクラスに接続。
    new_class->super_class  = super_class;
    meta_class->super_class = super_class->isa;
    meta_class->isa         = (void *)root_class->isa;
    // 最後に、クラスをランタイムに登録する
    objc_addClass( new_class ); 
    return YES;
    }


< 前ページ次ページ >


Last updated: 2003-09-16

製品のご購入・ご購入相談は、お気軽に アップルストアまで
0120-APPLE-1(0120-27753-1)

Copyright © 2004 Apple Computer, Inc.
All rights reserved. | Terms of use | Privacy Notice