这两个ViewController Pushes有什么区别?

时间:2010-09-30 01:08:33

标签: objective-c memory-management uiviewcontroller pushviewcontroller

苹果提供的样板推送之间的差异有何不同和含义

     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
 NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
 // ...
 // Pass the selected object to the new view controller.
 [self.navigationController pushViewController:detailViewController animated:YES];
 [detailViewController release];

这个方法(来自PragProg iphone SDK开发手册)的机柜控制器被添加到接口和@synthesize实现中:

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

我会把它归结为我正在使用的SDK与书的新颖性......但这似乎真的不同,似乎意味着非常不同的所有权,如果这是正确的话。如果这个问题过于复杂而无法回答,我主要担心的是这些方法中的一种是否更具内存效率。

编辑: 好吧,好吧,在通过发布这个问题清除我的愿景之后......我认为没有那么大的差别。样板方法按需分配内存,其中books方法使cabinet视图成为属性。我认为这样可以使样板方法更好......或者相等...那部分我仍然模糊不清。似乎两者都会发布相同的内容,但也许早先使用books方法保存。

2 个答案:

答案 0 :(得分:1)

Apple版本的内存效率更高,因为detailViewController及其视图在从导航控制器的堆栈中弹出时将被释放。与PragProg版本不同,后者在实例变量中保留cabinetController(因此阻止它被释放),Apple代码不存储对它正在创建的详细控制器的引用。

如果用户可能经常在机柜控制器和保留它的视图控制器之间来回导航,那么PragProg实现可能是有意义的,因为这可以避免因重复创建和取消分配对象而产生的一点CPU开销,但是你必须对它进行分析,看看是否会产生任何有意义的差异(通常不会这样)。

答案 1 :(得分:0)

在第二种情况下,似乎cabinetController是self指示的类的属性。在样板中,情况并非如此。