Obj-C:使用String名称创建对象

时间:2010-06-03 16:44:06

标签: iphone objective-c string class

嘿所有人。我知道这听起来很简单,但我找不到办法。我在Obj-C中有一个接受NSString的方法,然后应该创建一个以String作为标题的新类。

-(DataModel *)createDataModel:(NSString *)dataModel_name {
        DataModel *[initWithString:dataModel_name] = [[DataModel alloc] init];
        }

我知道我有一些问题。对于初学者,我不知道如何定义名称可能更改的对象的返回。其次,我知道这不会编译,因为initWithString方法是错误的。我只是不知道该怎么做或使用什么方法,以便我可以用指定的名称创建这个DataModel对象...

4 个答案:

答案 0 :(得分:2)

如果您的标题设置正确,则作为属性:

-(DataModel *)createDataModel:(NSString *)dataModel_name {
    DataModel *model = [[DataModel alloc] init];
    model.title = dataModel_name;
    return model;
}

在datamodel.h中需要:

@interface DataModel {
  NSString *title;
}
@property (nonatomic, retain) NSString *title;
@end

在你的.m:

@implementation DataModel
@synthesize title;
@end

但是你的问题不清楚你的真正目的是试图基于dataModel_name实例化不同的类,或者你是否只有一个通用类,其标题应该设置为dataModel_name。

根据您的目的,有不同的答案。如果你真的想要基于名称的不同类,那么你应该采取不同的方式。您可以使用Cocoa特定类型:id,从方法返回任何对象。然后是NSClassFromString()方法创建对象:

- (id)createDataModel:(NSString *)dataModel_name {
   id model = [[NSClassFromString(dataModel_name) alloc] init];
   [model setTitle:dataModel_name];
   return model;
}

或者您可以定义一个声明数据模型功能的协议(Java中的接口)。你的方法会返回它。

答案 1 :(得分:1)

NSClassFromString()会做你想要的。此外,最初将变量声明为类型id允许您稍后设置其显式类型。所以:

id dataModel = [[NSClassFromString(dataModel_name) alloc] init];

答案 2 :(得分:0)

找到或创建一个新类:

Class arbitraryClass = NSClassFromString(dataModel_name);
if ( nil == arbitraryClass ) arbitraryClass = objc_allocateClassPair( [DataModel class] , [dataModel_name UTF8String] , 0 );

使用新创建的类创建对象的新实例:

DataModel *modelWithArbitratyClassName = [[arbitraryClass alloc] init];

在运行时创建新类通常不是一个好主意。

答案 3 :(得分:0)

因此,您似乎希望在运行时动态地将Instance变量添加到对象。你没有免费获得这个。 CALayer和CAAnimation可以做类似的事情,你可以read about it here

您可以使用键值编码为您自己的对象添加类似的功能,更具体地说,可以使用方法valueForUndefinedKey。会有一些KVC特定的警告,所以你应该确保你熟悉并理解KVC。 Take a look at this,可能只是想要你想要的。

字典用于存储值和键,并在您尝试访问时检索值。