2010-06-03 79 views
2

嘿所有。我知道这听起来很简单,但我找不到办法。我有一个Obj-C中的方法,它接受一个NSString,然后创建一个新的类作为它的标题。Obj-C:创建一个字符串名称的对象

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

我知道我在这方面有一些问题。对于初学者,我不知道如何定义名称可能更改的对象的返回值。其次,我知道这并不考虑initWithString方法的错误。我只是不知道该怎么做或使用什么方法,以便我可以创建具有指定名称的此DataModel对象...

+0

我可以在Java中完成它,但我现在正在为iPhone开发,我仍然试图解决Obj-C的所有细节...... – FnGreg7 2010-06-03 16:49:35

+4

然后,也许你可以添加Java代码来使它更清楚..有人可以为你做一个基本的翻译。这可能会有所帮助 - 问题不那么清楚。在Objc中,您无法在运行时真正创建新的类。即使你设法,他们也没有头衔。 – hooleyhoop 2010-06-03 16:52:55

+0

你能解释一下你想做什么吗?你是否试图在运行时动态地定义一个新的类? – 2010-06-03 16:52:56

回答

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 

但是你的问题不清楚,如果y我们的真正目的是尝试基于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中的说法接口)。相反,你的方法会返回。

+0

setTitle名称是否会更改对象的名称?你仍然返回名为“model”的对象。我希望NSString * dataModelName成为DataModel对象的名称。这样,当我将该字符串输入到方法中时,我返回了一个DataModel对象,该对象名为我放入的字符串。 – FnGreg7 2010-06-03 17:10:57

+0

你是什么意思的“对象的名称”? Objective-C对象没有任何固有的“名称”。对象有一个“Class”(你可能不想动态地创建,就像drawonward所说的),并且它们可以有任何属性,比如你选择的“title”(就像这个例子)。 – 2010-06-03 17:20:57

+1

对象没有名称(在您使用“名称”的意义上)。类有名字。变量有名字。 变量可以保存对对象的引用。 如果你想给你的对象名称,你可以把它们放在一个NSDictionary中,并按名称访问它们。 – 2010-06-03 17:42:20

1

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

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

我觉得我说错了。我想创建对象的名称,这是dataModel,由传递给该方法的字符串动态命名。基本上,它应该是: DataModel *(STRING PASSED TO METHOD)= [[DataModel alloc] init]; – FnGreg7 2010-06-03 17:01:14

+1

@ FnGreg7:但为什么你需要这样做?你的方法的调用者并不关心你如何命名保存指针对象的局部变量。 – 2010-06-03 17:36:58

0

要查找或创建一个新类:

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

要创建新创建的类的对象的新实例:

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

在运行时创建新的类通常不是一个好理念。

0

所以,你似乎想在运行时动态地将一个实例变量添加到一个对象。你不会得到这个免费的。 CALayer和CAAnimation可以做类似的事情,你可以用read about it here

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

字典用于存储值和密钥,并在尝试访问它时检索该值。

相关问题