0

我想知道如何在使用ARC時編寫我的- tabliView:didSelectRowAtIndexPath:方法。Cocoa-Touch - 使用ARC時的pushViewController

弧我這樣做:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (self.addContactsVC == nil) { 
     self.addContactsVC = [[AddContactsViewController alloc] initWithNibName:nil bundle:nil]; 

    } 

    [self.navigationController pushViewController:self.addContactsVC animated:YES]; 

} 

什麼我不知道的是,難道是我保存視圖控制器類變量太多的開銷。我認爲,如果每次我想推入視圖控制器時都可以重用視圖控制器,而不是每次分配一個新視圖控制器時都是「良好實踐」

也許我應該只是做代替?:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 


    AddContactsViewController *addContactsVC = [[AddContactsViewController alloc] initWithNibName:nil bundle:nil]; 

    [self.navigationController pushViewController:addContactsVC animated:YES]; 

} 

回答

1

這是一個經典的權衡時間和空間之間。

  • 如果您實例化VC並保存它,那麼您將在第二次時更快地向用戶展示該VC控制器。但是,即使未使用該視圖控制器,您仍然擁有該視圖控制器的內存分配。另一方面,如果僅在需要時才分配VC,則長期保存內存(取決於ARC何時處理先前的VC),但是速度增益會超過預先設定的閾值,分配班級。

沒有進一步的信息,您的問題的答案是「它取決於...」。這將取決於您在何處/如果您在應用程序中發現了瓶頸,因爲您完全瞭解了內存使用情況並提高了性能。

我個人更喜歡在需要時分配VC,因爲它簡化了代碼。只有當用戶抱怨App出現緩慢時,我纔會考慮緩存VC。

+0

保存視圖控制器的另一個原因是,如果您希望在彈出和推送視圖控制器時能夠保持視圖控制器的當前狀態。 –

+0

@PeterWarbo ..起初我以爲「嗯..沒想到那個」,然後我想「嗯國家應該在模型中」。不確定這些想法是否是確定性的。 –

+0

好吧,像'NSString'這樣的模型對象被設置在被推入並彈出的視圖控制器中。如果我每次分配視圖控制器來推動它,那麼模型對象將是零,除非我重用相同的視圖控制器。 –