Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Obj-C:使用字符串名称创建对象_Iphone_Objective C_String_Class - Fatal编程技术网

Iphone Obj-C:使用字符串名称创建对象

Iphone Obj-C:使用字符串名称创建对象,iphone,objective-c,string,class,Iphone,Objective C,String,Class,大家好。我知道这听起来很简单,但我找不到办法。我在Obj-C中有一个方法,它接受一个NSString,然后应该创建一个新类,并将该字符串作为其标题 -(DataModel *)createDataModel:(NSString *)dataModel_name { DataModel *[initWithString:dataModel_name] = [[DataModel alloc] init]; } 我知道我在这方面有些问题。首先,我不知道如何定义名称可

大家好。我知道这听起来很简单,但我找不到办法。我在Obj-C中有一个方法,它接受一个NSString,然后应该创建一个新类,并将该字符串作为其标题

-(DataModel *)createDataModel:(NSString *)dataModel_name {
        DataModel *[initWithString:dataModel_name] = [[DataModel alloc] init];
        }
我知道我在这方面有些问题。首先,我不知道如何定义名称可能更改的对象的返回。其次,考虑到initWithString方法是错误的,我知道这不会编译。我只是不知道该做什么或使用什么方法来创建具有指定名称的此DataModel对象…

NSClassFromString()
将执行您想要的操作。此外,最初将变量声明为type
id
允许您稍后设置其显式类型。因此:

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

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

-(DataModel *)createDataModel:(NSString *)dataModel_name {
    DataModel *model = [[DataModel alloc] init];
    model.title = dataModel_name;
    return model;
}
这将需要在您的数据模型中。h:

@interface DataModel {
  NSString *title;
}
@property (nonatomic, retain) NSString *title;
@end
在你的.m中:

@implementation DataModel
@synthesize title;
@end
但您的问题并不清楚,您的真正目的是尝试基于dataModel_名称实例化不同的类,还是您只有一个标题应设置为dataModel_名称的泛型类

根据你想做什么,有不同的答案。如果您确实需要基于名称的不同类,那么您应该做不同的事情。您可以使用Cocoa特定的type:id从方法返回任何对象。然后使用NSClassFromString()方法创建对象:

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

或者您可以定义一个协议(java术语中的接口),声明数据模型的特性。您的方法将返回该值。

要查找或创建新类,请执行以下操作:

Class arbitraryClass = NSClassFromString(dataModel_name);
if ( nil == arbitraryClass ) arbitraryClass = objc_allocateClassPair( [DataModel class] , [dataModel_name UTF8String] , 0 );
要使用新创建的类创建对象的新实例,请执行以下操作:

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

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

因此,您似乎希望在运行时向对象动态添加实例变量。这不是免费的。CALayer和CAAnimation可以做类似的事情,你可以

您可以使用键值编码向自己的对象添加类似的功能,更具体地说是方法valueforundinedkey。将会有一些特定于KVC的注意事项,因此您应该确保熟悉并理解KVC,这可能只是你想要的


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

我可以用Java来做,但我现在正在为iPhone开发,我仍在尝试了解Obj-C的所有细节。然后,也许您可以添加Java代码以使其更清晰。。有人可以帮你做一个基本的翻译。这可能会有所帮助——问题并不那么清楚。在Objc中,您无法在运行时真正创建新类。即使你设法做到了,他们也没有头衔。你能解释一下你想做什么吗?您是否试图在运行时动态定义新类?@must:您可以使用Obj-C运行时创建新类,尽管您通常不需要这样做。@Georg我认为OP不想这样做。他希望实例变量符号在运行时更改为字符串的值。我想我说错了。我想用传递给方法的字符串动态地命名对象的名称,即dataModel。本质上,它应该是:DataModel*(传递给方法的字符串)=[[DataModel alloc]init]@FnGreg7:但你为什么要这么做?方法的调用方不关心如何命名保存对象指针的局部变量。setTitle名称是否会更改对象的名称?您仍然返回名为“model”的对象。我希望NSString*dataModelName成为DataModel对象的名称。这样,当我将字符串输入到方法中时,会返回一个名为我输入的字符串的DataModel对象。您所说的“对象名称”是什么意思?Objective-C对象实际上没有任何固有的“名称”。对象有一个“类”(正如drawnonward所说,您可能不想动态创建该类),并且它们可以有您选择的任何属性,如“title”(如本例所示)。对象没有名称(在您使用“name”的意义上)。类有名称。变量有名称。变量可以保存对对象的引用。如果要为对象命名,可以将它们粘贴到NSDictionary中并按名称访问它们。