2009-10-09 65 views
0

我有兩個屬性設置爲ViewControllers,每個屬性都使用不同的NIB文件。 (男性和女性模型,將功能相同,但設置視覺上不同。)我想有一個函數來創建基於我傳入的NIB名稱和ViewController的ViewController。將屬性傳遞給一個函數並設置要保留的值

發生什麼事是ViewController屬性不是被保留。如果我在函數中添加實際屬性名稱並設置它,viewController將被設置並保留ViewController。以下是我在.m文件中的內容(僅顯示獲得幫助所需的內容)。我一直在試圖確定問題出在哪裏的兩條評論欄中。

@synthesize femaleModelViewController; 
@synthesize maleModelViewController; 


    - (void) loadModelViewControllerWithModelType:(NSString*) model ModelView:(ModelViewController *)modelViewController { 
     ModelViewController *viewController = [[ModelViewController alloc] initWithNibName:model bundle:nil]; 
    // [self setFemaleModelViewController:viewController]; // I don't want to set the property here, I want to be able to pass it as an argument. 
     modelViewController = viewController; 
    // [modelViewController retain]; // I even tried to retain it do see if would but it doesn't. 
     [viewController release]; 
    } 

    - (void)viewDidLoad { 
     [super viewDidLoad]; 
     [self loadModelViewControllerWithModelType:@"FemaleModel" ModelView:femaleModelViewController]; 
     [self loadModelViewControllerWithModelType:@"MaleModel" ModelView:maleModelViewController]; 


} 

在.h文件我的屬性是設置像這樣:

@property (nonatomic, retain) ModelViewController *femaleModelViewController; 
@property (nonatomic, retain) ModelViewController *maleModelViewController; 

回答

0

你們是不是要指定一個新ModelViewControllermaleModelViewControllerfemaleModelViewController?如果是這樣,你就會以錯誤的方式去做。

坦率地說,我會完全廢除loadModelViewControllerWithModelType:modelView:方法。所有你需要在viewDidLoad做的是這樣的:

maleModelViewController = [[ModelViewController alloc] initWithNibName:@"MaleModel"]; 
femaleModelViewController = [[ModelViewController alloc] initWithNibName:@"FemaleModel"]; 

(這假定maleModelViewControllerfemaleModelViewController是實例變量支持同名的屬性)

當您在maleModelViewControllerfemaleModelViewController傳球,你沒有傳遞對這些變量的引用,你傳遞了它們的值。由於它們尚未初始化,因此您所做的只是傳入nil。要做你想做的事情,你需要將指針傳遞給變量(即聲明參數爲ModelViewController **,將其作爲&maleModelViewController&femaleModelViewController傳遞給它,並使用*modelViewController = viewController分配它。如果您習慣於使用像C#或Java這樣的引用友好的通用語言,你應該閱讀它如何在C中工作(Objective-C和C中的規則相同)。

然而,這仍然是完整的過度技術對於你想在這裏做什麼

此外,你的代碼仍然不能工作,因爲你轉身發佈viewController。這將導致它立即釋放,因爲你有唯一的引用它來自於當你alloc編輯它。你會分配一個死的引用,只要你嘗試使用它,就會使你的程序崩潰。

+0

謝謝!是的,我完全忘記了通過地址和價值。在Objective-C和C#之間來回切換可以做到這一點。 是的這個示例看起來像是過度殺傷性的,但是這個方法會比簡單地聲明它更多。如果我保留在這裏,它應該工作正確嗎? –

+0

保留在哪裏?有兩種方法可以獲得對象的保留引用:「alloc」或「保留」它。如果你已經分配了它,你也不需要保留它。另外,即使你有更多的初始化工作,它也會屬於視圖控制器的'initWithNibName:owner:'方法中,而不是任何類。不要將你的課程緊緊地綁在一起,否則整個應用程序變得脆弱。 – Alex

相關問題