创建新的Nav视图,哪一个应该是最好的?苹果手机

时间:2010-08-15 16:12:50

标签: iphone

我一直想知道哪种是加载导航视图的最佳方式。我发现有3种方法可以做到这一点而没有重大错误

我想知道哪一个最适合记忆并作为推荐做法?

1)
.h文件中没有声明(下面的代码不在.h文件中写入)

@interface companyViewController : UIViewController {  
    EmployeeViewController *employeeDetailViewController;  
}  
@property (nonatomic, retain) EmployeeViewController *employeeDetailViewController;  

然后在.m文件中没有@syntesize,在 dealloc 中没有释放,在 viewDidUnload 中没有nil,当我调用新视图时我做了:

EmployeeViewController *employeeController = [[EmployeeViewController alloc]  
      initWithNibName:@"EmployeeViewController" bundle:nil];  

[self.navigationController pushViewController:employeeController animated:YES];  
[employeeController release];  

2)
我在.h文件中创建它(下面的代码写在.h文件中)

@interface companyViewController : UIViewController {  
    EmployeeViewController *employeeDetailViewController;  
}  
@property (nonatomic, retain) EmployeeViewController *employeeDetailViewController;  

然后我在.m文件中@syntesize,在 dealloc 中有一个版本,在 viewDidUnload 中有一个nil,当我调用新视图时,我做了:

EmployeeViewController *employeeController = [[EmployeeViewController alloc]  
      initWithNibName:@"EmployeeViewController" bundle:nil];  

employeeDetailViewController = employeeController;  

[self.navigationController pushViewController:employeeController animated:YES];  
[employeeController release];  

3)
我喜欢2,但我称之为新视图

employeeDetailViewController = [[EmployeeViewController alloc]  
      initWithNibName:@"EmployeeViewController" bundle:nil];  

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

我觉得#3错了,因为根据我在内存管理中的理解,我在@property中分配了一次(nonatmoic,retain),当我决定调用它时,我也保留了它。这将使视图的保留计数为1并导致泄漏。

为了确保我不会创建过多的新视图并获得EXC_BAD_ACCESS或内存泄漏,哪一个应该是最好的?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

在这些示例中,您实际上并未使用您声明的属性。我会依次通过它们。

  1. 您创建了一个名为employeeDetailViewController的属性,但您从未合成它或在其中存储任何内容。您的视图控制器只会在将其传递给导航控制器之前存储在本地变量中。

  2. 您创建了一个名为employeeDetailViewController的实例变量,以及一个名为employeeDetailViewController的属性。但是,您从不在属性中存储任何内容,只能直接访问实例变量。由于您没有保留视图控制器(当您使用实例变量时它不会自动发生),您可能会出现过度释放的情况。

  3. 这个实际上会崩溃。您在没有定义pushViewController:employeeController的情况下告诉employeeController

  4. 所以,让我们考虑一下是对的。这里有两个问题:第一,如何使用属性,第二,是否需要实例变量/属性来引用视图控制器。

    考虑属性:

    要访问媒体资源,请使用self.propertyName。如果你直接使用propertyName,你就直接写入实例变量,并且完全绕过内存管理的东西(比如自动保留放在属性中的东西)。通常,您应该只在init或dealloc方法中执行此操作:您应该通过self.propertyName正确访问该属性的任何其他位置。

    您是否需要视图控制器的实例变量/属性?

    我会说你实际上并不需要你正在推动的视图控制器的实例变量或属性。一旦将其传递给导航控制器,通常您将无需再次访问它。我的代码版本是:

    aViewController = [[EmployeeViewController alloc]  
          initWithNibName:@"EmployeeViewController" bundle:nil];  
    
    [self.navigationController pushViewController:aViewController animated:YES];
    

    除非您想要从代码中的其他位置引用该特定视图控制器,否则这就是您所需要的。标题中没有任何内容,任何地方都没有属性。

答案 1 :(得分:0)

属性访问更像是

self.employeeDetailViewController = [[[EmployeeViewController alloc] initWithNibName:@"EmployeeViewController" bundle:nil] autorelease];

然后,

-(void)dealloc {
  self.employeeDetailViewController = nil;
  [super dealloc];
}