16

オブジェクトの小さなコレクションを追跡するために、オブジェクト ファクトリに取り組んでいます。オブジェクトはさまざまなタイプにすることができますが、それらはすべて および に応答しcreateInstanceますresetNSViewオブジェクトの一部は、 や などの組み込みココア クラスから派生する必要があるため、共通の基本クラスからオブジェクトを派生させることはできませんNSWindowController

次のように、目的のクラス名をファクトリに渡すだけで、適切なオブジェクトのインスタンスを作成できるようにしたいと考えています。

myClass * variable = [factory makeObjectOfClass:myClass];

メソッドは次のmakeObjectOfClass:ようになります。

- (id)makeObjectOfClass:(CLASSNAME)className
{
    assert([className instancesRespondToSelector:@selector(reset)]);
    id newInstance = [className createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

(CLASSNAME)className上記の引数で行ったように、クラス名をメソッドに渡す方法はありmakeObjectOfClass:ますか?

完全を期すために、すべてのオブジェクトを管理する理由を次に示します。を呼び出して、オブジェクトの完全なセットをワンショットでリセットできるようにしたいと考えています[factory reset];

- (void)reset
{
    [managedObjects makeObjectsPerformSelector:@selector(reset)];
}
4

5 に答える 5

23

関数を使用して文字列をクラスに変換できます: NSClassFromString

Class classFromString = NSClassFromString(@"MyClass");

ただし、あなたの場合は、 Class オブジェクトを直接使用する方がよいでしょう。

MyClass * variable = [factory makeObjectOfClass:[MyClass class]];

- (id)makeObjectOfClass:(Class)aClass
{
    assert([aClass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [aClass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}
于 2008-11-24T21:58:45.040 に答える
5

私はそれについてより良いチュートリアルを持ってい ます。 https://appengineer.in/2014/03/13/send-class-name-as-a-argument-in-ios/をチェックしてください

于 2015-04-28T07:48:24.877 に答える
3

クラスを動的に指定するのは非常に簡単です。実際、名前で参照するだけです。

id string = [[NSClassFromString(@"NSString") alloc] initWithString:@"Hello!"];
NSLog( @"%@", string );

もう 1 つのヒントとして、他のほとんどの Cocoa プログラマーは Core Data からそれを NSManagedObject と読むため、「管理対象オブジェクト」という命名法を使用しないようにします。さまざまな種類のオブジェクトのコレクションを管理する代わりに、グローバル NSNotification (すべてのリセット可能なオブジェクトがサブスクライブする) を使用する方が簡単だと思うかもしれませんが、あなたは私よりもその決定を行うための情報に精通しています.

于 2008-11-24T21:56:35.763 に答える
3

他の回答に欠けている回答のビットは、あなたとメソッド@protocolを含むを定義できるということです。+createInstance+reset

于 2008-11-24T22:08:33.757 に答える
2

次のようなものが必要なようです。

- (id)makeObjectOfClassNamed:(NSString *)className
{
    Class klass = NSClassFromString(className);
    assert([klass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [klass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

これは、 という名前のクラス メソッドを想定してい+createInstanceます。または、単に使用することもできます[[klass alloc] init]

それを呼び出すには:

MyClass *variable = [factory makeObjectOfClassNamed:@"MyClass"];

何をしようとしているのかによっては、文字列よりもクラス オブジェクトを渡すほうがよい場合があります。次に例を示します。

MyClass *variable = [factory makeObjectOfClass:[MyClass class]];
于 2008-11-24T21:55:14.063 に答える