7

Objective-C での動的型付けについての話をたくさん見てきました。しかし、私はそれが本来あるべきだと思う例を見たことがありません。

2 つのオブジェクト (1 つが割り当てられ、もう 1 つが解放される) をジャグリングすることになっている汎用関数があり、呼び出し元のオブジェクトが新しく割り当てられたオブジェクトにそれ自体をアタッチするとします。どちらもclass0から継承

これが何かを説明すると思うなら、これを自由に解釈してください!!

クラスが実行時に選択された場合、引数リストを処理するにはどうすればよいですか (? は今のところプレースホルダーです) 実行時までクラスが定義されていないオブジェクトを割り当てるにはどうすればよいですか?

-(void) juggle:(?*)objclass1:(?*)objclass2{

? temp = [? alloc] init];
objclass1 = temp;
[temp release];

[objclass2.view removefromsuperview];
[self.handle insertsubview:objclass1.view];

}
4

2 に答える 2

19

そこにあるコードが何をしようとしているのかわかりません。構文的に有効ではなく、ビューの操作はあなたの質問とは何の関係もありません。とにかく、本当に型がわからない場合は、通常、codegen の「void *」に型キャストされる「id」を使用します。任意のメッセージを受信すると想定されるという特別なプロパティがあるため、不明なメッセージに対するコンパイラの警告はトリガーされません。

クラスをインスタンス化するには、「クラス」オブジェクトを保持する必要があります。Objective C では、クラスのすべてのインスタンスは、メソッドにも応答する Class オブジェクト (従来のランタイムの isa ポインター) を参照します。つまり、次のコードでは次のようになります。

NSArray *myObject = [[NSArray alloc] init];

NSArray は実際にはオブジェクトです。したがって、これは同等のコード結果を生成します。

Class myClass = [NSArray class];
NSArray *myObject = [[myClass alloc] init];

あるいは

Class myClass = NSClassFromString(@"NSArray");
NSArray *myObject = [[myClass alloc] init];

これは、ランタイムに入り、渡された名前のクラスを見つける関数 NSClassFromString を使用します。

クラスゲッターを使用する場合、すべてのオブジェクトはクラスを返すため、既存のオブジェクトと同じクラスのオブジェクトをインスタンス化するには、次のようにします。

- (void) leakObjectWithSameClassAs:(id)object {
    [[[object class] alloc] init];
}
于 2009-02-26T06:02:49.777 に答える
0

これは私が今持っているものです

- (void)flipfromv1tov2:(UIViewController*)v1:(NSString*)nib1:(UIViewController*)v2{

    if(v1 == nil)
    {
        UIViewController *newview = [[[v1 class] alloc] initWithNibName:nib1 bundle:nil];
        v1 = newview;
        [newview release];
    }
    [v2.view removeFromSuperview];
    [self.view insertSubview:v1.view atIndex:0];    
}

リンクの問題があるため、まだ確認できません...この機能をルートコントローラーに追加しましたが、何らかの理由で、関数が暗黙的に宣言されているという警告が表示されます。関数呼び出しが何にもリンクされないため、ビルドは失敗します

于 2009-02-26T06:37:53.640 に答える