4

私はある程度有能な Ruby プログラマーです。昨日、ついに Apple の Cocoa フレームワークを試してみることにしました。ObjC の方法で物事を見るのを手伝ってください。

私は頭を動かそうとしていobjc_allocateClassPairますobjc_registerClassPair. 私の目標は、いくつかのクラスを動的に生成し、他のクラスと同じように使用できるようにすることです。これは Obj C で機能しますか?

class を割り当てて登録Aすると、呼び出し時にコンパイル エラーが発生します[[A alloc] init];( と表示されます'A' Undeclared)。Aランタイムのメソッドを使用してのみインスタンス化できますobjc_getClass。私のようにコンパイラAにメッセージを伝えて渡す方法はありますNSStringか? コンパイラフラグか何か?

10 ほどの他のクラス ( BC、…) があり、すべて同じスーパークラスがあります。[A classMethod]を必要とせずに、コード ( 、[B classMethod]、…)で直接メッセージを送信したいobjc_getClass。ここであまりにも動的にしようとしているのですか、それとも単に実装を台無しにしているのでしょうか? こんな感じ…</p>

 NSString *name = @"test";  
 Class newClass = objc_allocateClassPair([NSString class], [name UTF8String], 0);  
 objc_registerClassPair(newClass);  

 id a = [[objc_getClass("A") alloc] init];  
 NSLog(@"new class: %@ superclass: %@", a, [a superclass]);  
 //[[A alloc] init]; blows up.
4

4 に答える 4

5

爆発する理由[[A alloc] init];は、コンパイラが何Aを意味するのか見当がつかないからです。Aコンパイラは、それがそこにあることさえ知りません。

編集:また、あなたが望むのは次のようです:

@interface A : NSObject {
  NSString *myString;
}

- (id)initWithString:(NSString *)string;

- (void)doItToIt;

@end

多分

@interface NSString (MyPrivateExtension)

- (void)doItToIt;

@end
于 2010-03-15T13:45:52.490 に答える
1

http://www.mikeash.com/pyblog/friday-qa-2010-11-6-creating-classes-at-runtime-in-objective-c.htmlおよびhttps://github.com/をご覧ください。 mikeash/MAObjCRuntime

何を達成しようとしているのかを説明し、生の Objective-C ランタイム呼び出しをうまく抽象化しています。

于 2013-11-21T12:35:45.353 に答える
1

Objective-C 言語でクラスを定義すると、コンパイラは新しい型を定義します。クラスを動的に作成する場合、コンパイラはその型を認識しないため、唯一の選択肢は、クラスを ID として使用し、メッセージを動的に送信することです。Ruby は動的に型付けされた言語であり、実行時にクラスを定義するときにコンパイラと同じメカニズムを使用する可能性があります。

于 2010-05-28T16:07:16.423 に答える
0

これを行うことができ、オープンソースであるすばらしいF-ScriptFSClassを見てください。FSClass は、実行時にサブクラス化できるメタクラスを定義します。

objc_allocateClassPairobjc_registerClassPairを使用することで機能しますが、おそらく役立つ他の多くのことが行われています (私を超えて!)。

于 2010-05-28T16:48:35.207 に答える