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'这样的模型对象被设置在被推入并弹出的视图控制器中。如果我每次分配视图控制器来推动它,那么模型对象将是零,除非我重用相同的视图控制器。 –