2013-03-17 43 views
0

是否可以檢查並獲取對象初始化的類名稱?如何檢查目標C中初始化的對象是什麼類C

示例:我有Class A.我通過實例方法使用[[ABOBject alloc] init];創建了對象ABObject。

如何找到創建實例ABObject的類,即「A」?

+2

看一看:http://stackoverflow.com/q/2055940/1758762 – duDE 2013-03-17 13:50:52

+3

你能解釋爲什麼你需要這些信息嗎?它聞起來有一種奇怪的設計。 – 2013-03-17 14:14:08

+0

我需要這個信息,因爲我有一個對象的類,我想在其他類中採取不同的行爲。所以我想把這個小功能硬編碼到它裏面 – s6luwJ0A3I 2013-03-20 02:00:59

回答

2

對象可以在一個類的上下文之外創建,所以它不適合作爲內置語言功能。

如果必須這樣做,解決此問題的一種方法是在任何此類對象實例化後立即使用objc/runtime.h中的objc_setAssociatedObjects()函數。例如:

ABObject *object = [[ABObject alloc] init]; 
objc_setAssociatedObject(object, @"InstantiatingClassKey", [self class], OBJC_ASSOCIATION_ASSIGN); 

然後你可以用objc_getAssociatedObject(object, @"InstantiatingClassKey")得到它。

我認爲你最好重新評估你的設計,因爲這不會特別可維護。即使將其抽取到NSObject的類別中,以刪除重複的代碼,您仍然需要額外的步驟來記住對象與您的對象之間的奇怪關係。

此外,正如Martin R.在評論中指出的那樣,我正在使用一個快捷方式並傳遞一個字符串作爲該函數的關鍵參數,實際上您會想要遵循使用地址的做法一些靜態或全局變量。

+2

小問題:你的例子依賴於'@「InstantiatingClassKey」'是一個編譯時間常量的事實。我認爲推薦的模式是'objc_setAssociatedObject(object,,...)'。 – 2013-03-17 14:15:46

+0

@MartinR你絕對正確,我爲了說明的目的採取了一條捷徑。 – 2013-03-17 14:21:11