2012-01-12 78 views
0

考慮以下實施的幾個類:三種不同類別的 .m文件執行anotherClass如何將一個子類設置爲obj-c中超類的屬性?

@implementation anotherClass 

@synthesize myObj; 

... 
//All of the code that uses the myObj property... 
... 

@end 

//superClass.h 
... 
@interface superClass 

//Insert useful code 

@end 

//subClass.h 
... 
@interface subClass : superClass 

//Insert useful code 

@end 

//Another class that uses various sub-classes of superClass 
@interface anotherClass 
{ 
    superClass* myObj; 
} 
@property (strong, atomic) superClass* myObj; 

@end 

.h文件中實現我怎樣才能將subClass的實例設置爲屬性anotherClass.myObj的實例?

在我的具體情況下,我想定義一個屬性是UIViewController。我有多個子類,UIViewControllers,我需要能夠交換他們在我的iOS應用程序中的特定屬性。

每次我嘗試將我的孩子UIViewControllers中的一個設置爲我的UIViewController屬性時,該應用程序崩潰。但是,如果我將屬性重新定義爲其中一個子類的實例,然後實例化子類,則它完美地起作用。我真的需要有能力將這些控制器交換出來。我怎樣才能做到這一點?

UPDATE

好,向大家致歉誰一直在尋找這一點。得到一個明顯的答案後,我決定重新編寫所有相關的代碼。我創建了一個具有不同名稱的新屬性,將我的所有分配代碼註釋掉,並重新編寫它以指向新的屬性。它的工作方式應該如此。我不確定爲什麼這不是第一次,但它現在應該如此。但是,我仍然不清楚爲什麼我的應用程序崩潰。

+0

將子類分配給超類型變量是完全合法的,不會導致問題。它在UIKit中完成_constantly_。請發佈有關崩潰的更多詳細信息,以及您在分配前後如何處理對象。 – 2012-01-12 20:07:03

+0

謝謝Josh(和Caleb)我會將Caleb的回答標記爲答案。我不確定發生了什麼,因爲我認爲這會起作用,因爲它不會讓我迷路。我會更多地討論代碼,看看我能否制定一個不同的問題。 – RLH 2012-01-12 20:14:01

回答

1

只要做這項工作。 subClass的每個實例也是superClass的實例。這是subtype polymorphism的行動。

+0

但是,對於我在前幾段中概述的情況,它不起作用。 – RLH 2012-01-12 20:07:37

+2

@RLH你至少可以告訴我們*爲什麼它會崩潰?當它崩潰時,你會得到什麼錯誤信息?調試問題時會發生什麼?什麼方法導致崩潰?發佈有問題的(實際)代碼也不會有什麼壞處。 – Caleb 2012-01-12 20:13:04

+0

這是代碼:'myProperty = [[SubUIViewController alloc] initWithNibName:@「SubUIView」bundle:nil]; '。當我的應用程序點擊該行時,它會發出以下錯誤:***由於未捕獲的異常'NSInvalidArgumentException'而終止應用程序,原因:' - [MasterClass setMyProperty:]:無法識別的選擇器發送到實例0x399210'。 – RLH 2012-01-12 20:17:55