2010-06-03 113 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,它可能只是想要你想要的。

字典用於存儲值和密鑰,並在嘗試訪問它時檢索該值。

相關問題