2011-01-06 72 views
4

類類型在接口方面我有這樣的:目標C - 在運行時確定

Animal*  myPet; 

在運行時,我可能要myPet是一隻貓或狗,這是動物的子類:

id newPet; 
    if(someCondition) { 
      newPet = [[Cat alloc] initWithNibName:@"Cat" bundle:nil]; 
    } else { 
      newPet = [[Dog alloc] initWithNibName:@"Dog" bundle:nil]; 
    } 
    self.myPet = newPet; 

顯然這是不正確的,但我希望它足以顯示我正在嘗試做什麼。這樣做的最佳做法是什麼?

+3

爲什麼這樣說錯了? – 2011-01-06 23:54:35

+2

請注意,在您的代碼中執行大量`isKindOfClass:`通常表示您正在以艱難的方式做事。 – bbum 2011-01-07 00:01:22

回答

8

強類型newPetAnimal *而不是idid可以保存對任何類的實例的引用,但屬性不能與它一起使用(點語法需要強類型的左值)。由於CatDog都繼承自Animal,因此這將是完全正確和有效的。

如果您使用兩個類共享一個共同的祖先(過去NSObject),那麼你應該退後一步,重新考慮設計 - 爲什麼這兩個類的實例需要佔用相同的變量?

9

isKindOfClass是你的朋友:

[newPet isKindOfClass:Dog.class] == NO 
3
NSString *className = @"Cat"; 
Animal *myPet = [[NSClassFromString(className) alloc] init]; 

目前還不清楚你是什麼後,但如果你想創建一個字符串命名的類的實例,這應該這樣做。

2

對於任何基於標題從谷歌抵達的:「確定在運行時類的類型」,這裏有一些有用的東西就知道:

你可以叫上NSObject*class方法在運行時獲得一個參考到同級。

[myObject class]; 

在這些方法也看看: